ric*_*oon 10 java java-8 java-stream
如何在不使用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());
Run Code Online (Sandbox Code Playgroud)
sak*_*029 13
使用像这样的偷看方法.它不会影响流.
List<Foo> newFoos = foos.stream()
.filter(Foo::isBlue)
.peek(foo -> foo.setTitle("Some value"))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
不要那样做。
如果您使用函数式模式,请勿在其中引入任何命令式/过程式内容。
目的map是将一个物体转变成另一个物体。它的设计目的是纯粹的功能性(无副作用)。不要违反其功能意义。
改用forEach:
List<Foo> newFoos = foos.stream()
.filter(foo -> Foo::isBlue)
.collect(toList());
newFoos.forEach(foo -> foo.setTitle("Some value"));
Run Code Online (Sandbox Code Playgroud)
你在这里没有什么可失去的。甚至行数也保持不变(如果您担心的话)。但代码的可读性和安全性要高得多。
如果您需要两条管道而不是一条,那就继续吧。不要试图使代码更短。这种情况下的代码长度与安全性和可维护性无关。
forEach似乎是一个更适合这项工作的工具,但如果您不想使用它,您可以随时定义一个匿名多行 lambda:
List<Foo> foos = foos.stream()
.filter(foo -> Foo::isBlue)
.map(foo -> {
foo.setTitle("Some value");
return foo;
})
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6668 次 |
| 最近记录: |