我正在读《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
表明
“循环融合”一词意味着不存在过滤循环、映射循环、限制操作,而是只有一个循环(概念上)执行整个工作,相当于以下单个循环:
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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)