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

使用Java流从嵌套列表中查找数据,java,for-loop,java-8,java-stream,nested-lists,Java,For Loop,Java 8,Java Stream,Nested Lists,我需要从嵌套的列表中找到一些对象 我相信类代码是不需要的,因为过滤是在嵌套的中为每个循环公开的 int value = someValue; MyObject found = null; for (List<MyObject> list : nestedList) { for (MyObject myObject : list) { if (myObject.isType() && myObject.getValue() == value) {

我需要从嵌套的
列表中找到一些对象

我相信类代码是不需要的,因为过滤是在嵌套的
中为每个循环公开的

int value = someValue;

MyObject found = null;
for (List<MyObject> list : nestedList) {
  for (MyObject myObject : list) {
    if (myObject.isType() && myObject.getValue() == value) {
      found = myObject;
    }  
  }
}
如何使用流替换代码中每个循环的

第二个循环的解决方案
for

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

您可以将
findAny
用作:

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

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

这有助于第二次循环

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());
List-inner=Arrays.asList(Arrays.asList(1,2,3),Arrays.asList(4,2,6));
List optinner=internal.stream().flatMap(List::stream).filter(整数->
整数==2.collect(Collectors.toList());

感谢对
flatMap
的良好使用,可以将其用于我的第二个嵌套
for
?@QA\u Col
flatMap
流一起将嵌套列表缩减为一个对象流。如果确实需要查找最后一个,只需将
findAny()
替换为
reduce((a,b)->b)
可以。尽管这很少需要。
MyObject found = nestedList.stream()
        .flatMap(List::stream)
        .filter(myObject -> myObject.isType() && myObject.getValue() == someValue)
        .findAny()
        .orElse(null);
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());