findAny из вложенного списка с использованием потоков Java - PullRequest
1 голос
/ 13 июня 2019

Мне нужно найти какой-нибудь объект из вложенного List.

Я считаю, что код класса не нужен, потому что фильтрация раскрывается во вложенном For-Each Loop.

int value = someValue;

MyObject found = null;
for (List<MyObject> list : nestedList) {
  for (MyObject myObject : list) {
    if (myObject.isType() && myObject.getValue() == value) {
      found = myObject;
    }  
  }
}

Другое вложенное для:

List<MyObject> listMyObject = new ArrayList<>();
for (List<MyObject> list : nestedList) {
  for (MyObject myObject : list) {
    if (myObject.isType() && myObject.getValue() == value) {
      listMyObject.add(myObject);
    }  
  }
}

Я начал с этого кода, но я в замешательстве.

nestedList.stream()
.forEach(list -> list.stream()
         .filter(myObject -> myObject.isType() && myObject.getValue() == value)
         .findAny()
);

Как заменить For-Each Loop в моем коде с помощью потоков?

Решение для второго цикла for

listMyObject = nestedList.stream()
    .flatMap(List::stream)
    .filter(myObject -> myObject.isType() && myObject.getValue() == value)
    .collect(Collectors.toList());

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Вы можете использовать findAny как:

MyObject found = nestedList.stream()
        .flatMap(List::stream)
        .filter(myObject -> myObject.isType() && myObject.getValue() == someValue)
        .findAny()
        .orElse(null);

хотя ваш фактический код обеспечивает выбор последнего найденного объекта, поскольку вы переопределяете объект каждый раз, когда выполняются условия.

0 голосов
/ 13 июня 2019

Это помогает для вашего второго цикла

List<List<Integer>> inner=Arrays.asList(Arrays.asList(1,2,3),Arrays.asList(4,2,6));

List<Integer> optinner= inner.stream().flatMap(List::stream).filter(integer -> 
integer==2).collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...