gpt4 book ai didi

java - Java-8 中 Stream 的循环融合(内部工作原理)

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:45:08 24 4
gpt4 key购买 nike

我正在阅读“Java in Action”一书。

并且在书上看到了Stream的示例代码。

List<String> names = menu.stream()
.filter(d -> {
System.out.println("filtering" + d.getName());
return d.getCalories() > 300;
})
.map(d -> {
System.out.println("mapping" + d.getName());
return d.getName();
})
.limit(3)
.collect(toList());

代码执行后,结果如下。

filtering __1__.
mapping __1__.
filtering __2__.
mapping __2__.
filtering __3__.
mapping __3__.

也就是说,由于 limit(3),日志消息只打印了 3 次!在本书中,这被称为“循环融合”。但是,我不明白这一点。因为,如果你知道一个对象是否被过滤,你就必须计算过滤函数。然后,我认为应该打印“过滤...”消息。

请解释一下循环融合在内部是如何工作的。

最佳答案

“因为,如果你[想]知道一个对象是否被过滤,你必须计算过滤函数”,是的,但也许你的样本数据不足以说明这一点。如果你尝试

List<String> result = Stream.of("java", "streams", "are", "great", "stuff")
.filter(s -> {
System.out.println("filtering " + s);
return s.length()>=4;
})
.map(s -> {
System.out.println("mapping " + s);
return s.toUpperCase();
})
.limit(3)
.collect(Collectors.toList());
System.out.println("Result:");
result.forEach(System.out::println);

它会打印

filtering java
mapping java
filtering streams
mapping streams
filtering are
filtering great
mapping great
Result:
JAVA
STREAMS
GREAT

表示

  • 为了找到匹配过滤器的三个元素,您可能必须评估三个以上的元素,这里评估四个元素,但您不需要评估后续元素一旦你有三场比赛

  • 后续映射函数只需要应用于匹配元素。这允许得出结论,是否指定了 .map(…).limit(…).limit(…).map(…) 是无关紧要的。
    这不同于相关的 .filter.limit 的相对位置。

术语“循环融合”意味着没有过滤循环、映射循环、限制操作,而是只有一个循环(概念上)执行整个工作,相当于以下单个循环:

String[] source = { "java", "streams", "are", "great", "stuff"};
List<String> result = new ArrayList<>();
int limit = 3;
for(String s: source) {
System.out.println("filtering " + s);
if(s.length()>=4) {
System.out.println("mapping " + s);
String t = s.toUpperCase();
if(limit-->0) {
result.add(t);
}
else break;
}
}

关于java - Java-8 中 Stream 的循环融合(内部工作原理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42804226/

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