链接消费者Java 8

时间:2016-07-17 07:42:30

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

您好我遇到以下问题。让我们说我们有对象"帐户"这个对象帐户是不可变的,所以加班我们对它执行一个动作,我们实际上将它转换为另一个状态。例如,Account可以成为ClosedAccount或NewAccount等。现在在某些情况下我的过渡是反射帐户被转换为帐户但是非常小的东西被改变,例如" modifiedDate"。因为我的帐户本质上是不可变的,即使反思操作仍在创建具有更新值的新帐户。如果我的对象不是不可变的,我会使用类似的东西:

List<String> accountsIds;
accountIds.parrallelStream.map(t->NewAccount)
          .map(t->Account)
          .peek(t->changetheDate())
          .map(t->closeAccount())
          .forEach(bla bla bla)

现在的问题是peek()只会改变可变对象的状态。但在我的情况下,帐户是不可变的,所以即使我创建一个新对象,该对象也不会进一步流式传输。

问题是可以链接消费者&#34;以这样的方式,他们的工作就像&#34; map&#34;方法输出&#34;消费者&#34;成为下一个&#34; Consumer&#34;的投入。换句话说,我正在寻找&#34; peek&#34;适用于Immutable对象的操作。

我问这个问题的原因是因为我的理解是&#34; map&#34;是一个转换操作,而我想执行更像Action的东西。它只是作为一个转换操作,因为我正在处理不可变对象,但如果我使用的是可变对象,那么它只是一个动作。

1 个答案:

答案 0 :(得分:3)

您可能正在尝试解决不存在的问题。我认为使用map()对对象进行任何更改都是完全正常的,无论更改有多小。

我的理解是,map()peek()等操作背后没有语义含义,您可以将其中任何一个用于任何适合的任务。

peek()通常用于调试:它允许您在不使用终端操作和销毁流的情况下记录流中的每个项目。当您需要对对象执行某些操作并将其传递时,将使用map()

另外,请考虑一下:Consumer接口中的方法有一个输入参数,它不返回任何值。如果你的输入参数是不可变的,那么就不可能在没有任何肮脏技巧的情况下从这个方法中返回任何值。