如何在不使用forEach()的情况下调用Stream链中的setter?
List<Foo> newFoos = foos.stream()
.filter(foo -> Foo::isBlue)
.map(foo -> foo.setTitle("Some value")) //I am unable to use this because also changing the data type into Object
.collect(Collectors.toList());
答案 0 :(得分:11)
使用像这样的peek方法。它不会影响流。
List<Foo> newFoos = foos.stream()
.filter(Foo::isBlue)
.peek(foo -> foo.setTitle("Some value"))
.collect(Collectors.toList());
答案 1 :(得分:2)
forEach
似乎是一个更适合工作的工具,但是如果你不想使用它,你总是可以定义一个匿名的多行lambda:
List<Foo> foos = foos.stream()
.filter(foo -> Foo::isBlue)
.map(foo -> {
foo.setTitle("Some value");
return foo;
})
.collect(Collectors.toList());
答案 2 :(得分:0)
请勿这样做。
如果您使用功能模式,请不要在其中引入任何命令性/程序性内容。
map
的目的是将一个对象转换为另一个对象。它的设计意图是纯粹的功能(无副作用)。不要违反其功能含义。
改为使用forEach
:
List<Foo> newFoos = foos.stream()
.filter(foo -> Foo::isBlue)
.collect(toList());
newFoos.forEach(foo -> foo.setTitle("Some value"));
在这里您不会失去任何东西。即使行数保持不变(如果您对此有所担心)。但是该代码更具可读性和安全性。
如果您需要两个管道而不是一个,请继续。不要试图使代码更短。在这种情况下,代码长度与安全性和可维护性无关。