使用Java流从嵌套列表中查找findAny

时间:2019-06-13 03:34:59

标签: java for-loop java-8 java-stream nested-lists

我需要从嵌套的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()
);

如何使用Streams替换代码中的For-Each Loop

第二个循环for

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

2 个答案:

答案 0 :(得分:1)

您可以将findAny用作:

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

尽管您的实际代码可确保选择最后找到的对象,因为每次满足条件时您都会覆盖该对象。

答案 1 :(得分:0)

这有助于您进行第二次循环

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());