gpt4 book ai didi

java - 比 Stream.peek() 更好的方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:46:46 25 4
gpt4 key购买 nike

“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,看起来是对 map 的误用。另外,它读起来不像业务逻辑。

最终编辑:我接受了@Holger 的回答。不能期望 Stream.peek 处理 Stream 上的所有元素,因为它不是终端操作。 map 也是如此。即使您可能已经终止流并保证它会处理所有操作,您也不应该编写期望每个用户都这样做的代码。因此,要进行处理,您应该在 Collection 上使用 forEach,然后根据需要再次开始流式传输 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 几乎具有“In Java streams, is peek really only for debugging?”中解释的 peek 的所有缺点。 ”

关于java - 比 Stream.peek() 更好的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42117419/

25 4 0