Java 8 可选是否应更改其包含的对象的状态?

Java 8 可选是否应更改其包含的对象的状态?,java-8,Java 8,类是否应该更改它所持有的对象的状态?或者每个返回流的中间操作都不应该改变对象的易变性? 例如: 当包含实例变量时,是否应用相同的原则。例如 Optional.ofNullable(this.person) .ifPresent(person -> person.setAge(25)); 考虑到在API(如Stream和Comparator)中对文档语义约束的注意程度,我认为Optional中不存在此类约束是做任何事情的默认许可。它给出的唯一警告是避免使用synchronizati

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

当包含实例变量时,是否应用相同的原则。例如

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

考虑到在API(如
Stream
Comparator
)中对文档语义约束的注意程度,我认为
Optional
中不存在此类约束是做任何事情的默认许可。它给出的唯一警告是避免使用synchronization或==等选项,因为它是一种不可变的值类型,并且有许多操作,例如
filter
map
创建新对象,而不是修改现有对象。

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

可选文档的对象,来自文档:

可以包含或不包含非空值的容器对象。如果存在值,isPresent()将返回true,get()将返回该值

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

但请查看Raoul Gabriel Urma关于使用选项的文档:

在这里,他使用可选项,并在出现时对其进行处理

Optional<Soundcard> soundcard = ...;
soundcard.ifPresent(System.out::println);
可选声卡=。。。;
声卡.ifPresent(System.out::println);
就像您在第一段代码中所做的那样


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

这让我的皮肤有点蠕动——所以我会说,凭直觉,不。我不知道为什么。我认为它可能是函数范例和可变状态的组合。
可选
并没有使对象不可变,它只是增加了缺席的选项。此外,
ifPresent
没有没有没有副作用的用例,这使得它非常突出,例如
map
filter
Optional<Soundcard> soundcard = ...;
soundcard.ifPresent(System.out::println);