2016-04-27 77 views
1

Optional類應該改變它保存的對象的狀態嗎?或者每個返回流的中間操作都不應該改變對象的可變性? 例如:應該可選更改其包含的對象的狀態?

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

當它包含一個實例變量時是否適用同樣的原則。 E.g

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

這讓我的皮膚有點爬 - 所以我會說,在直覺上,不。不能告訴你爲什麼。我認爲這可能是功能範式和可變狀態的結合。 –

+1

'可選的'不*使對象不可變,它只是增加了不存在的選項。此外,對於沒有副作用的「ifPresent」沒有用例,這使得它突出顯示,例如, 'map'或'filter'。 – Holger

回答

2

這是一個很好的問題!我認爲答案是一個選擇問題。我的答案是沒有。

一個可選的目的,從文檔:

的容器對象,其可以或可以不包含一個非空值。如果存在一個值,isPresent()將返回true,get()將返回該值。

所以它不應該確實比:)

以上,但檢查出拉烏爾·加布裏埃爾Urma的doc使用選配上:http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html

在這裏,他使用了可選的和做一些事,如果禮物

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

就像你在你的第一段代碼。

但使用可選的檢查實例變量只是似乎有點...髒。

0

給多少小心地記錄在API,如StreamComparator語義約束,我會拿不出這樣的約束在Optional作爲默許做任何你想要的。唯一要小心的是避免同步或==等選項,因爲它是一個不可變的值類型,許多操作,如filtermap創建新的對象,而不是修改現有的對象。

相關問題