Преобразование вложенных циклов for с фильтром JAVA8

#java-8

Вопрос:

 class MyObject {
  String key;
  String value;
}
 

У меня есть два списка, listA listB содержащих MyObject объекты.

Я пытаюсь преобразовать нижеприведенные вложенные циклы for в потоки Java8 на основе :

 for(String objA : listA) {
   for(String objB : listB) {
       if(objA.getKey().equals(objB.getKey()) amp;amp; !objA.getValue().equals(objB.getValue())) {
           // create an object of a different class `MyDiff` with params as 
           // objA.getKey(), objA.getValue(), objB.getValue()
           // and push it to a list.
       }
   }
}
 

Я попытался решить эту проблему с помощью JAVA8, как,

 List<MyDiff> diff = listA.streams().filter(objA -> {
    listB.stream.anyMatch(objB -> objA.getKey().equals(obj.getKey()) amp;amp; !objA.getValue().equals(obj.getValue()))
})
 

Но anyMatch не возвращает объект, и я не могу использовать filter его вместо него.

Ответ №1:

Вы можете использовать оператор flatMap() и filter() для завершения.

 List<MyDiff> diff = 
    listA.stream().flatMap(objA ->
        listB.stream()
             .filter(objB -> objA.getKey().equals(objB.getKey()) amp;amp; !objA.getValue().equals(objB.getValue()))
             .map(objB -> new MyDiff(objA.getKey(), objA.getValue(), objB.getValue())))
    .collect(Collectors.toList());