我有一个案例,其中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中的任何其他解决方案?
答案 0 :(得分:2)
我希望我的班级结构合适。
您可以使用flatMap
获取所有Stream
个实例的Property
个B
,并返回具有所需密钥的所有属性(如果找到) :
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);