Optional是否应该更改它包含的对象的状态?

时间:2016-04-27 21:44:32

标签: java-8

Optional类是否应该更改它所拥有的对象的状态?或者每个返回流的中间操作都不应该改变对象的可变性? 例如:

Optional.ofNullable(repository.gePersonById(id))
    .ifPresent(person -> person.setAge(25));

当它包含实例变量时,是否适用相同的原则。 E.g

Optional.ofNullable(this.person)
    .ifPresent(person -> person.setAge(25));

2 个答案:

答案 0 :(得分:2)

这是一个很好的问题!我认为答案是一个选择问题。我的答案是否定的。

可选的对象,来自docs:

  

容器对象,可能包含也可能不包含非null值。如果存在值,则isPresent()将返回true,get()将返回该值。

所以它不应该做的更多:)

但请查看Raoul-Gabriel Urma关于使用选项的文档:http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html

在这里,他使用了可选项,并在存在的情况下执行了某些操作

Optional<Soundcard> soundcard = ...;
soundcard.ifPresent(System.out::println);

就像你在第一段代码中那样。

但是使用Optional来检查实例变量似乎有点......很脏。

答案 1 :(得分:0)

考虑到在StreamComparator这样的api中记录语义约束需要多少注意,我会在Optional中缺少这样的约束,因为默认允许你做任何事情想。它给出的唯一警告是避免计算同步或==等可选,因为它是一个不可变的值类型,许多操作,如filtermap创建新对象而不是修改现有的之一。