Как конвертировать этот код с помощью потоков - PullRequest
0 голосов
/ 01 июня 2018

У меня есть следующие классы:

Class A {
List<B> b
 //getters and setters
   }
  CLass B {
   List<C> c
 //getters and setters
}
  Class C {}

Теперь у меня есть список:

List<List<A>> listA;

Что я хочу сделать, это удалить элемент типа A из внутренних списковlistA, если каждый элемент List<B> имеет пустой List<C>.Я сделал это с помощью итераторов, но теперь я должен сделать это с помощью потоков.Следующий код работает с использованием итераторов:

Iterator<List<A>> iterator1 = listA.iterator();
      while(iterator1.hasNext()) {
          Iterator<A> iterator2 = iterator1.next().iterator();
          while(iterator2.hasNext()) {
              List<B> listB =iterator2.next().getB();
              Iterator<B> iterator3 = listB.iterator();
              int i=0;
              while(iterator3.hasNext()) {
                  if(iterator3.next().getC().size() != 0) {
                      continue;
                  }
                  else {
                      i++;
                      if(i == list.size()) {
                          iterator2.remove();
                      }
                  }
              }
          }
      }

Может кто-нибудь помочь мне преобразовать это в потоки ??

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Нет.Вы не должны пытаться "удалить" с потоком.Поток предназначен для сохранения состояния, а переменные должны быть неизменными.Поток можно использовать для просмотра ваших списков и сбора значений, которые вы хотите сохранить, в новый список.

0 голосов
/ 02 июня 2018

То, что я хочу сделать, это удалить элемент типа A из внутренних списков listA, если каждый элемент List имеет пустой список.Я сделал это с помощью итераторов, но теперь я должен сделать это с помощью потоков

Вы можете достичь этого довольно просто с помощью одного filter() конвейера:

List<A> cleanedList = listA.stream()
        .filter(a -> a.getListB().stream().map(B::getListC).noneMatch(List::isEmpty))
        .collect(Collectors.toList());
0 голосов
/ 01 июня 2018

Вы можете обработать поток во внутренних списках, а затем отфильтровать элементы A на основе данных в их полях b:

List<List<A>> selected = 
       listA.parallelStream()
            .map(aList -> aList.stream()
                    .filter(a -> a.getB()
                                  .stream()
                                  .anyMatch(b -> !b.getC().isEmpty()))
                    .collect(Collectors.toList()))
            .collect(Collectors.toList());

Чтобы удалить из одного экземпляра списка, вы можете просто запуститьоснованная на индексе итерация по основному списку, а затем явное удаление из внутренних списков элементов, соответствующих критериям:

IntStream.range(0, listA.size())
    .forEach(
      i -> listA.get(i)
        .removeAll(
          listA.get(i)
            .stream()
            .filter(a -> a.getB().stream().allMatch(b -> b.getC().size() == 0))
        .collect(Collectors.toList())) );

Этот последний фрагмент просто компилирует List<A> (который каким-то образом содержит пустой List<C>в дереве) удаляется из соответствующих записей в основном списке.

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