据我所知,Java8中的Streams只能收集一次(如forEach()
终止),但我想知道我们是否可以设法"点击"进入流中间的一系列过滤和映射任务,产生一些附带效应。
从本质上讲,"点击"就像做一个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>
}
有什么想法吗?
答案 0 :(得分:6)
我能想到的最接近你想要的是peek:
Stream peek(消费者行为)
返回由此流的元素组成的流, 另外对每个元素执行提供的操作 从结果流中消耗元素。
这是一个中间操作。
它允许您在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>
}