如何在Java8流中管理附带效果

时间:2015-02-19 11:32:58

标签: java functional-programming java-8 java-stream

据我所知,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>
}

有什么想法吗?

1 个答案:

答案 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>
}