如何在 Java8 流中管理附带效应
How could collateral effects be managed in Java8 streams
我知道 Java8 中的流只能收集一次(如 forEach()
终止)但我想知道我们是否可以设法 "tap" 进入流中过滤和映射任务链的中间,以产生一些附带效果。
本质上,"tapping" 就像做一个 forEach()
但在管道的那个点返回 Stream。
我会这样使用它:
List<User> createAndPersistRandomUsers(int count) {
return IntStream.range(0, count)
.boxed() // returns Stream<Integer>
.map(UserBuilder::random) // returns Stream<User>
.tap(userRepo::persist) // Collateral persist of user, returns Stream<User>
.collect(toList()); // returns List<User>
}
有什么想法吗?
我能想到的最接近你想要的东西是 peek :
Stream peek(Consumer action)
Returns a stream consisting of the elements of this stream,
additionally performing the provided action on each element as
elements are consumed from the resulting stream.
This is an intermediate operation.
它允许您在使用 Stream 的同时对 Stream 的元素执行操作。
List<User> createAndPersistRandomUsers(int count) {
return IntStream.range(0, count)
.boxed() // returns Stream<Integer>
.map(UserBuilder::random) // returns Stream<User>
.peek(userRepo::persist) // Collateral persist of user, returns Stream<User>
.collect(toList()); // returns List<User>
}
我知道 Java8 中的流只能收集一次(如 forEach()
终止)但我想知道我们是否可以设法 "tap" 进入流中过滤和映射任务链的中间,以产生一些附带效果。
本质上,"tapping" 就像做一个 forEach()
但在管道的那个点返回 Stream。
我会这样使用它:
List<User> createAndPersistRandomUsers(int count) {
return IntStream.range(0, count)
.boxed() // returns Stream<Integer>
.map(UserBuilder::random) // returns Stream<User>
.tap(userRepo::persist) // Collateral persist of user, returns Stream<User>
.collect(toList()); // returns List<User>
}
有什么想法吗?
我能想到的最接近你想要的东西是 peek :
Stream peek(Consumer action)
Returns a stream consisting of the elements of this stream, additionally performing the provided action on each element as elements are consumed from the resulting stream.
This is an intermediate operation.
它允许您在使用 Stream 的同时对 Stream 的元素执行操作。
List<User> createAndPersistRandomUsers(int count) {
return IntStream.range(0, count)
.boxed() // returns Stream<Integer>
.map(UserBuilder::random) // returns Stream<User>
.peek(userRepo::persist) // Collateral persist of user, returns Stream<User>
.collect(toList()); // returns List<User>
}