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

And*_*rey 1 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
Run Code Online (Sandbox Code Playgroud)

重构代码:

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
Run Code Online (Sandbox Code Playgroud)

流有什么问题?

Sot*_*lis 8

假设createLine增加了pool,这个

.orElse(createLine(color));
Run Code Online (Sandbox Code Playgroud)

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

你可能正在寻找orElseGet一个Supplier会打电话的人createLine(color).

orElseGet(() -> createLine(color));
Run Code Online (Sandbox Code Playgroud)