【发布时间】:2015-07-14 06:06:59
【问题描述】:
这可能更多是关于函数式编程的问题,而不是专门针对 Java 8 的问题,但这是我现在正在使用的。
我有一个源对象(可以代表一个存储库,或一个会话...,在这里无关紧要),它有一个方法retrieveSomething(),它返回一个Optional<SomethingA>。
我在某处有一个返回Something 的方法,通过调用retrieveSomething() 并在可选为空的情况下提供默认值,如下所示:
return source.retrieveSomething()
.orElseGet(() -> provideDefaultValue());
现在我想修改此代码,以便在源不包含任何值的情况下(因此可选为空),源将更新为提供的默认值。
当然,我可以在 lambda 表达式代码块中轻松做到这一点:
return source.retrieveSomething()
.orElseGet(() -> {
Something sth = provideDefaultValue()
source.putSomething(sth);
return sth;
});
但如果我理解正确的话,我不应该使用会导致副作用的函数。那么执行此操作的“正确”(功能性)方法是什么,保持使用Optional 的好处(在实际代码中,我实际上也在对其执行map 操作,但这在这里无关紧要)?
【问题讨论】:
-
等一下。您正在尝试更新
Optional?从概念上讲,这没有任何意义。Optional要么存在,要么你提供一个新值来代替它。 -
在这里定义“副作用”。目前尚不清楚您的输入是什么。
-
@Makoto 不,我不想更新
Optional。我想更新Optional的来源(可能是数据库、REST 服务、HTTP 会话……),以便下次调用retrieveSomething()时,它不会返回空的@987654334 @。假设provideDefaultValue()是一个非常繁重的计算。 -
@fge with "side effect" 我的意思是
source.putSomething(sth)将进行数据库调用、Web 服务调用或任何其他 IO 操作。 -
更新源以包含默认值是一个副作用,不管你怎么做(除非可能涉及单子......)。没有副作用是没有办法的。
标签: java functional-programming java-8