【发布时间】:2019-12-07 10:31:03
【问题描述】:
我在 youtube (venkat subramaniam) 上看到了 Let’s Get Lazy: Explore the Real Power of Streams 视频。 (大约 26-30 分钟)
在示例中,一个 for 循环:
List<Integer> numbers = Arrays.asList(1, 2, 3, 5, 4, 6, 7, 8, 9, 10);
int result = 0;
for(int e: values){
if(e > 3 && e % 2 == 0){
result = e * 2;
break;
}
}
有 8 个“单元操作”
按照他的例子:
public class MainClass {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 5, 4, 6, 7, 8, 9, 10);
System.out.println(
numbers.stream()
.filter(e -> e > 3)
.filter(e -> e % 2 == 0)
.map(e -> e * 2)
.findFirst()
.orElse(0)
);
}
}
这段代码看起来有 21 个“单元操作”。
然后他推荐使用这个代码:
public class MainClass {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 5, 4, 6, 7, 8, 9, 10);
System.out.println(
numbers.stream()
.filter(MainClass::isGT3)
.filter(MainClass::isEven)
.map(MainClass::doubleIt)
.findFirst()
.orElse(0)
);
}
private static int doubleIt(Integer e) {
return e * 2;
}
private static boolean isEven(Integer e) {
return e % 2 == 0;
}
private static boolean isGT3(Integer e) {
return e > 3;
}
}
我真的很想明白,这怎么证明有 8 个单元操作而不是 21 个单元操作?
【问题讨论】:
-
外部 YouTube 视频不是在此论坛上提出问题的一个很好的基础。理想情况下,您的问题应该以 text 的形式包含某人为您提供答案所需的所有信息。
-
@mah454 在找到匹配条件的第一个元素之前,视频中的计算总数与代码相关,为 (stream 10+filter 7+ filter 4)。但是使用适当的终端操作,您可以将计算评估为精确值,即使用 AtomicInteger 计数为每个操作增加 1。
-
@TimBiegeleisen 你是完全正确的。我编辑了提取部分的问题和需要正确询问的代码。感谢您的通知
标签: java java-8 stream java-stream