2016-04-27 3 views
1

Optionalクラスは、保持しているオブジェクトの状態を変更する必要がありますか?ストリームを返すすべての中間演算は、オブジェクトの変更可能性を決して変更してはいけませんか? 例:それはインスタンス変数が含まれている場合必要に応じて、含まれているオブジェクトの状態を変更しますか?

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

同じ原理が適用されます。例えば、このようなStreamComparatorなどのAPIで意味制約を文書化するために取られているどのくらいのケアを考える

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

これは私の肌のクロールを少ししています - だから私は、腸の感覚ではないと言います。理由を教えてもらえません。私はそれが機能的パラダイムと可変状態の組み合わせかもしれないと思う。 –

+1

'オプション'はオブジェクトを不変にしません。存在しないというオプションを追加するだけです。さらに、副作用のない 'ifPresent'のユースケースは存在せず、これはそれを目立たせる。 'map'または' filter'です。 – Holger

答えて

2

これは良い質問です!私は答えが選択の問題だと思う。私の答えはNOです。ドキュメントから

任意のオブジェクト、:

または非ヌル値を含んでも含まなくてもよいコンテナオブジェクト。値が存在する場合、isPresent()はtrueを返し、get()は値を返します。

だから、本当に:)それ以上にすべきではない

しかしOptionalsを使用して上のラウル・ガブリエルUrmaのドキュメントをチェックアウト:http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html

ここで彼はオプションを使用している場合、それを使って何かをします現在

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

最初のコードと同様です。

しかし、インスタンス変数をチェックするためのオプションを使用するとちょっと...汚れているようです。

0

、私はあなたがやりたいためにOptionalとして暗黙の権限で、そのような制約がないことを取るだろう。それは不変の値の型であり、多くの操作、例えばfiltermapは既存のものを変更するのではなく、新しいオブジェクトを作成するため、オプションで同期や==などのカウントを避けることだけです。