【发布时间】: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