java - 我在 for 和 stream 中有不同的结果,为什么?

标签 java for-loop java-8 java-stream

我有 Flyweight 模式,我尝试将循环转换为流,但结果不同:

public Line getLine(Color color) {
    for(Line line: pool) {
        if(line.getColor().equals(color)) {
            return line;
        } 
    }        
    return createLine(color);
}

factory.getLine(Color.RED);
factory.getLine(Color.RED);
System.out.println(getPool().size()); // print 1

重构代码:

public Line getLine(Color color) {
    return pool.stream()
               .filter(l -> l.getColor().equals(color))                   
               .findFirst()                   
               .orElse(createLine(color));
}

factory.getLine(Color.RED);
factory.getLine(Color.RED);
System.out.println(getPool().size()); // print 2

流有什么问题?

最佳答案

假设 createLine 添加到 pool,这

.orElse(createLine(color));

首先调用 createLine(color),然后将结果传递给被调用的 orElse(T)

您可能正在寻找 orElseGet与将调用 createLine(color)Supplier

orElseGet(() -> createLine(color));

关于java - 我在 for 和 stream 中有不同的结果,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25916821/

相关文章:

matlab - 由于矢量化时内存不足,因此加快了 for 循环的速度

java - For 循环 读取 char 时加 3

Java 8 流聚合通用列表以映射

java - GWT 2.5.1 和 Kindle paperwhite 用户代理

java - charAt() 或子字符串?哪个更快?

javascript - 如何在 JavaScript 中使用循环函数声明变量 x1、x2、...、x10?

java - ServerSocket如何接收多个文件

java - 如何通过比较值对 HashMap 的条目进行排序,其中每个值都是一个 int[]?

java - Java中csv文件中列的加权平均值

java - JBoss 5 perm 大小和堆大小