我和for stream有不同的结果,为什么?

时间:2014-09-18 15:31:36

标签: 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

流有什么问题?

1 个答案:

答案 0 :(得分:8)

假设createLine添加到pool,此

.orElse(createLine(color));

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

您可能正在寻找orElseGet SuppliercreateLine(color)会致电orElseGet(() -> createLine(color));

{{1}}