我有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
流有什么问题?
答案 0 :(得分:8)
假设createLine
添加到pool
,此
.orElse(createLine(color));
首先调用createLine(color)
,然后将结果传递给调用的orElse(T)
。
您可能正在寻找orElseGet
Supplier
,createLine(color)
会致电orElseGet(() -> createLine(color));
。
{{1}}