目前我有:
cardLabels = cards.stream()
.map(ImageSupplier::getCard)
.map(JLabel::new)
.collect(toList());
cardLabels.stream().forEach(container::add);
我可以写lambda表达式:
.map(c ->{
JLabel label = new JLabel(c);
container.add(label);
return label;
})
但似乎很长。我可以调用.doStuff(container::add)
之类的内容,并返回JLabel
的流吗?
答案 0 :(得分:5)
也许您正在寻找peek
:
return cards.stream()
.map(ImageSupplier::getCard)
.map(JLabel::new)
.peek(container::add);
返回由此流的元素组成的流,另外在每个元素上执行提供的操作,因为元素是从结果流中消耗的。
这是一个中间操作。
答案 1 :(得分:1)
最好避免在流中改变外部数据结构。如果container
未同步或并发且流将并行,则结果将无法预测。
不要试图在流表达式中加入更多内容,只需简化第二个语句:
cardLabels = cards.stream()
.map(ImageSupplier::getCard)
.map(JLabel::new)
.collect(toList());
container.addAll(cardLabels);
这样,将stream()
更改为parallelStream()
就不会意外搞砸您的逻辑。