【问题标题】:Chaining Consumers Java 8链接消费者 Java 8
【发布时间】:2016-11-20 00:21:22
【问题描述】:

您好,我遇到以下问题。假设我们有对象“Account” 这个对象 Account 是不可变的,所以超时我们对它执行一个动作,实际上是在将它转换为另一个状态。例如 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() 只会改变可变对象的状态。但在我的情况下,帐户是不可变的,因此即使我创建一个新对象,该对象也不会进一步流式传输。

问题是有可能以这样的方式链接“消费者”,使它们像“映射”方法一样工作,“消费者”的输出成为下一个“消费者”的输入。换句话说,我正在寻找适用于不可变对象的“窥视”操作。

我问这个问题的原因是因为我的理解是“map”是一个转换操作,而我想执行一些更像是一个动作的东西。它只是一个转换操作,因为我使用的是不可变对象,但如果我使用的是可变对象,那将只是一个动作。

【问题讨论】:

  • 是的,map 就是你想要的。
  • 好吧,也许这只是一个语言问题,但不知何故,我没有将“地图”与“动作”联系起来。
  • 我不认为你所描述的实际上是一个动作。您正在获取一个不可变对象并获得一个(可能是新的、稍加修改的)不可变对象。
  • 这只是一个例子,实际上它可以是calculateInterest(),例如它会返回一个相同类型的计算对象。
  • 这仍然是一个转变。

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


【解决方案1】:

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

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

peek() 常用于调试:它允许您在不使用终端操作和破坏流的情况下记录流中的每个项目。 map() 用于当您需要对对象做某事并将它们传递给它们时。

另外,想一想:Consumer 接口中的方法只有一个输入参数,它不返回任何值。如果您的输入参数是不可变的,那么如果没有任何肮脏的技巧,就不可能从此方法返回任何值。

【讨论】:

  • 我想我一直在寻找隐藏在“Map() 和 peek() 等操作背后没有语义意义”这句话后面,我一直在寻找某种语义意义。
猜你喜欢
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多