使用Stream API嵌套foreach

时间:2016-08-18 12:55:16

标签: java foreach java-8 java-stream

我有一个案例,其中A有一个B列表,B有一些我需要的属性。

pseudocode structure
class A
   List<B> elements;

class B
   Property property;

我有A的列表。为了获得属性,我应该通过双foreach循环来获得我想要的属性。像这样:

String myFutureProp = null;
for (A a: list of A) {
    for(B b: list of B) {
       if("MY_PROPERTY".equals(b.getKey) {
           myFutureProp = b.getValue();   
       }
    }
}

我正在考虑使用Stream API让它更美味。我期待着 forEach()解决方案:

final String[] myFutureProp = {null}
    a.getElements()
               .foreach(b -> b.getElements().stream()
                      .filter("MY_PROPERTY"::equals)
                      .forEach(prop -> myFutureProp[0] = (String)prop.getValue);

然后我正在接受myFutureProp [0]但说实话它看起来很难看。是否可以使用Stream API中的任何其他解决方案?

2 个答案:

答案 0 :(得分:2)

我希望我的班级结构合适。

您可以使用flatMap获取所有Stream个实例的PropertyB,并返回具有所需密钥的所有属性(如果找到) :

Optional<String> myFutureProp =
    aList.stream()
         .flatMap(a->a.getElements().stream().map(B::getProperty))
         .filter(prop->prop.getKey().equals("MY_PROPERTY"))
         .map(Property::getValue)
         .findAny();

答案 1 :(得分:1)

这应该做的工作 - &gt;获取最后一个匹配值

final String value = bList.stream()
    .flatMap(bElement -> bElement.elements().stream())
    .map(aElement -> aElement.getProperty())
    .filter(property -> property.getKey().equals("MY_PROPERTY"))
    .map(property -> property.getValue())
    .reduce((a,b) -> b).orElse(null);