2017-05-11 8 views
3

オプションで値をリストに追加する理想的な方法を探しています。 最終的なリストは不変でなければなりません。Java:オプションの値が存在する場合、Guava ImmutableListに追加します。

例 -

Optional<Item> optionalItem = getOptionalItemFromSomewhereElse(); 

List<Item> list = ImmutableList.builder() 
         .add(item1) 
         .add(item2) 
         .optionallyAdd(optionalItem) 
        .build(); 
+0

これはGuavaまたはJava 8の「オプション」ですか。 – shmosel

+0

@shmose:lはい、そうです。 – Skywalker

+8

どれが?????? – shmosel

答えて

6

私はそれが存在だ場合、最後にオプションの項目を追加します。その後

ImmutableList.Builder<Item> builder = ImmutableList.<Item>builder() 
    .add(item1) 
    .add(item2); 
optionalItem.ifPresent(builder::add); 

、私はリストを作成したい:

ImmutableList<Item> list = builder.build(); 
+0

既にこれを行っていますが、私はこのローカル変数 "builder"を避けたいと考えています。 – Skywalker

2

あなたがGuavaを使用していると仮定すると、ここには単純な1ライナーがあります:

List<Item> list = Stream.concat(Stream.of(item1, item2), Streams.stream(optionalItem)) 
     .collect(ImmutableList.toImmutableList()); 

注:Java 8およびGuava 21以上が必要です。

+0

Upvoted、ビルダーのローカル変数アプローチが好きです。 Java 9では、 'Optional'には要素ストリームまたは空ストリームのどちらかを返す' stream() 'メソッドがあります。したがって、Guava 21の' Streams.stream(optionalItem)の代わりに 'optionalItem.stream()'だけが必要です。 ) ' –

+1

@FedericoPeraltaSchaffnerそれは[前に説明しました](http://stackoverflow.com/questions/43925445/java-add-to-list-if-value-is-not-null/43925630?noredirect=1#comment74884323_43925445) OPの「理想」の定義はあまり明確ではない。私は私の解釈と一緒に行ったが、あなたも大丈夫だ、IMO。私はOPがJava 9を使用していないと思うのは安全だと思います。私はGuavaの「Optional」を使用していると思われます。私の解決策はいずれかの可能性をカバーします – shmosel

+0

あなたのソリューションは絶対に正しいと確信していますし、理想的です、OPによると。私たちは、OPがまだJava 9を使用していないと思うかもしれません:) JavaとGuavaの「Optional」の両方をサポートするために 'Streams.stream'がオーバーロードされていますか? –

関連する問題