【发布时间】:2017-06-26 07:47:25
【问题描述】:
“peek”主要用于调试。如果我想在流的中间调用流上的方法,这会改变流对象的状态。
Stream.of("Karl", "Jill", "Jack").map(Test::new).peek(t->t.setLastName("Doe"));
我能做到:
Stream.of("Karl", "Jill", "Jack").map(Test::new).map(t->{t.setLastName("Doe"); return t;});
但这看起来很难看。这是不应该做的事情还是有更好的方法来做到这一点?
编辑:forEach 可以工作,只是它是一个终端操作,所以之后你不能继续在流上工作。然后我希望制作一个 Collection,做 forEach,然后再次开始流式传输 Collection。
编辑:map(Class::processingMethod) 是我现在正在做的,但由于processingMethod 只是返回this,这似乎是对地图的滥用。另外,它读起来不像业务逻辑。
最终编辑:我接受了@Holger 的回答。不能期望Stream.peek 处理 Stream 上的所有元素,因为它不是终端操作。 map 也是如此。即使您可能已经终止了您的流以保证它会处理所有操作,但您不应该编写期望每个用户都这样做的代码。因此,要进行处理,您应该在Collection 上使用forEach,然后如果您愿意,可以再次开始流式传输Collection。
【问题讨论】:
-
您在寻找
forEach吗?地图适用于每个元素。 -
@matt - forEach 可以工作,只是它是一个终端操作,所以你不能在之后继续处理流。然后我希望制作一个集合,执行
forEach,然后再次开始流式传输集合。你认为有理由这样处理吗?