gpt4 book ai didi

Java 8 流 - 在平面图之后引用原始流对象

转载 作者:搜寻专家 更新时间:2023-10-31 08:25:21 25 4
gpt4 key购买 nike

我目前有以下代码。

方法 - parseGreeting()

    public GetGreetingNmsObjects parseGreeting(String greetingType, GetGreetingNmsResponse xmlFromNms) {

GetGreetingNmsObjects objectFound = null;
List<GetGreetingNmsObjects> objList = xmlFromNms.getObject();
for (GetGreetingNmsObjects obj : objList) {

List<Attribute> attrs = obj.getAttributes();
Optional<Boolean> found = attrs.stream()
.filter(a -> a.name.equals(GREETING_TYPE))
.map(a -> a.value.equals(greetingType))
.findAny();

if(found.get()) {
objectFound = obj;
break;
}

return objectFound;
}

GetGreetingNmsObjects.java

public class GetGreetingNmsObjects {
List<Attribute> attributeList;

public List<Attribute> getAttributes() {
return attributeList;
}
}

在上面的方法中,有没有办法避免for循环和if语句,自己处理流?

我尝试使用“flatmap”并获取“attributesList”的流,但是一旦找到匹配项,我就无法获取对“GetGreetingNmsObjects”对象的引用。

GetGreetingNmsObjects objectFound = objList.stream()
.flatMap(grt -> grt.getAttributes())
.filter(a -> a.name.equals(GREETING_TYPE))
.map(a -> a.value.equals(greetingType))
????

最佳答案

您的原始代码包含逻辑错误:

Optional<Boolean> found = …
.map(a -> a.value.equals(greetingType))
.findAny();

这将返回任意比较的结果,在顺序上下文中,它可能是第一个元素的结果。

我很确定你真的想知道是否有任何匹配的元素,因此,应该使用

boolean found = …
.anyMatch(a -> a.value.equals(greetingType));

这可以简单地用作谓词来查找具有匹配元素的第一个元素:

return xmlFromNms.getObject().stream()
.filter(obj -> obj.getAttributes().stream()
.filter( a -> a.name.equals(GREETING_TYPE))
.anyMatch(a -> a.value.equals(greetingType)))
.findFirst().orElse(null);

关于Java 8 流 - 在平面图之后引用原始流对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41762736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com