Соответствие элементам вложенных циклов - PullRequest
0 голосов
/ 09 июля 2019

У меня есть 2 списка списков, таких как

List<List<A>> list1;
List<List<B>> list2;

Эти классы A и B имеют поле id.

class A{
   String id;
   String name;
}

class B{
   String id;
}

Я могу сопоставить эти элементы и манипулировать экземплярами B name в 4 вложенных циклах

for(List<A> l1: list1){
   for(A a : l1){
      for(List<B> l2: list2){
         for(B b : l2){
            if(b.id.equals(a.id))
               b.name = "X";
         }
      }
   }
}

Но я пытаюсь найти более разумное решение. Есть ли способ сопоставить их в 2 вложенных циклах?

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Вы можете сделать это с одним Stream в

list1.stream()
     .flatMap(List::stream)
     .map(A::getId)
     .distinct()
     .forEach(id -> list2.forEach(bList -> bList.forEach(b -> { if (b.id.equals(id)) b.name = "X";  })));
0 голосов
/ 09 июля 2019

Вы можете использовать Java 8 stream API.

Сначала соберите все идентификаторы объектов A в Набор или Карту (если вы хотите получить доступ к этому объекту), а затем проверьте для каждого объекта B, существует ли он в Set / Map.

Set<Integer> idSet = list1.stream().flatMap(aList -> aList.stream()).map(A::id).collect(Collectors.toSet());

затем

for(List<B> l2: list2){
     for(B b : l2){
        if(idSet.contains(b.id))
           b.name = "X";
     }
 }

Это также можно сделать без потокового API, запустив два цикла для list1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...