“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;});
但这看起来很丑。这是不应该做的事情还是有更好的方法来做到这一点?
EDIT: forEach
可以工作,只是它是一个终端操作,因此您之后无法继续处理流。然后我希望创建一个集合,执行 forEach,然后再次开始流式传输集合。
EDIT: map(Class::processingMethod)
这就是我现在正在做的事情,但是自从processingMethod
只是返回this
,这似乎是地图的误用。另外,它读起来并不像业务逻辑。
最终编辑:我接受了@Holger的回答。Stream.peek
不能期望处理 Stream 上的所有元素,因为它不是终端操作。同样适用于map
。即使您可能已经使用保证流能够处理所有操作的内容终止了流,但您不应该编写期望每个用户都这样做的代码。因此,要进行处理,您应该使用forEach
on a Collection
,然后开始流式传输Collection
如果你愿意的话,再来一次。
您过度使用方法引用。简单性Test::new
如果它使您的流使用的其余部分变得复杂,那么它就没有任何价值。
一个明确的解决方案是:
Stream.of("Karl", "Jill", "Jack")
.map(first -> { Test t = new Test(first); t.setLastName("Doe"); return t; })
…
或者更好
Stream.of("Karl", "Jill", "Jack").map(first -> new Test(first, "Doe")) …
假设该类具有接受两个名称的不太牵强的构造函数。
上面的代码解决了用例,其中操作操作本地构造的对象,因此仅当该对象将被后续 Stream 操作消耗时该操作才相关。对于其他情况,该操作对 Stream 外部的对象有副作用,滥用map
几乎具有所有的缺点peek
解释于“在Java流中,peek真的只能用于调试吗? https://stackoverflow.com/a/33636377/2711488”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)