gpt4 book ai didi

java-8 - 流 API : Replace for-each loop (with expensive operation-call inside) with stream

转载 作者:行者123 更新时间:2023-12-05 00:47:14 25 4
gpt4 key购买 nike

我目前正在努力提高我的 Java8 技能并偶然发现了这个案例。
我的目标是替换方法 foo 中的现有循环在方法中使用一些 Java8 流 fooStream .

问题是,我在循环内调用了一个非常昂贵的操作,并希望在此调用的结果符合我的期望时退出它。我的流实现现在总是比我的老式循环实现多一倍(在映射调用中)进入极其昂贵的操作。

可以改进我的流实现以防止这个额外的调用吗?

public class Foo {
public static void main(final String[] args) {
final List<String> someList = Arrays.asList(null, null, "xxx", null, null, "foo");
foo(someList);
fooStream(someList);
}

public static String foo(final List<String> someList) {
for (final String foo : someList) {
final String result = extremelyExpensiveOperation(foo, "loop");
if (result != null) {
return result;
}
}

return null;
}

public static String fooStream(final List<String> someList) {
return someList //
.stream() //
.filter(p -> extremelyExpensiveOperation(p, "streamFilter") != null) //
.map(p -> extremelyExpensiveOperation(p, "streamMap")) //
.findFirst().orElse(null);
}

private static String extremelyExpensiveOperation(final String foo, final String operation) {
System.out.println("entered extremelyExpensiveOperation: " + operation);
// do some extremely expensive operation
// but in our show and tell case just return foo
return foo;
}

}

最佳答案

这应该相当简单:

return someList //
.stream() //
.map(p -> extremelyExpensiveOperation(p, "streamFilter"))
.filter(Objects::nonNull)
.findFirst()
.orElse(null);

关于java-8 - 流 API : Replace for-each loop (with expensive operation-call inside) with stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52078611/

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