В терминах высокого уровня ваш код должен:
- перебрать список1
- для каждого элемента проверьте, появляется ли его строка данных где-нибудь в списке2
- если это так, включить в результат номер строки элемента list1
Чтобы сделать код быстрым, на втором шаге можно предварительно вычислить набор строк данных list2. Все еще в терминах высокого уровня, код:
List<int> filtered(List<Abc> list1, List<Abc> list2) {
var dataStrings = setOf(list2.map(x -> x.dataString));
var abcs = list1.filter(x -> dataStrings.contains(x.dataString));
return abcs.map(x -> x.rowNum);
}
В стандартной Java код выглядит более раздутым, конечно:
List<int> filtered(List<Abc> list1, List<Abc> list2) {
Set<String> dataStrings = list2.stream()
.map(x -> x.dataString))
.collect(Collectors.toSet());
return list1.stream()
.filter(x -> dataStrings.contains(x.dataString))
.map(x -> x.rowNum)
.collect(Collectors.toList());
}