调用对象方法并使用函数api返回相同的对象

时间:2015-04-26 20:39:15

标签: java java-8 java-stream

目前我有:

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的流吗?

2 个答案:

答案 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()就不会意外搞砸您的逻辑。