2017-09-03 16 views
1

次のコードを検討してください。 Stream APIを扱う際にコード内で不変性を達成することが重要であることを読んでいます。不変性のある小文字の項目すべてのリストを取得するにはどうすればよいですか?Java 8ストリームAPIで不変性を実現する方法

List<String> stockList = Arrays.asList("GOOG", "AAPL", "MSFT", "INTC"); 
    List<String> stockList2 = new ArrayList<>(); 
    stockList.parallelStream() 
      .filter(e -> !e.contains("M")) 
      .map(String::toLowerCase) 
      .map(e -> stockList2.add(e)) 
      .collect(toList()); 
    stockList2.forEach(System.out::println); 
+0

文字列はまだ不変なので、在庫リスト2は在庫リストの文字列から作成された新しい文字列を保持しますリスト – urag

+1

あなたが尋ねたものではありませんが、一般的には注意してParallelStreamを使用するべきです(単純なケースではオーバーヘッドは利点) –

+3

この文脈では、不変性の意味がはっきりしません。どうか明らかにしてください。 – shmosel

答えて

14

あなたはListに要素を追加するmap()を使用すべきではありません。 map()は、1つのタイプのエレメントのStreamを別のタイプのエレメントのStreamに変換することになっています。

collect(Collectors.toList())によって返さListを使用します。

List<String> stockList2 = 
    stockList.stream() 
      .filter(e -> !e.contains("M")) 
      .map(String::toLowerCase) 
      .collect(Collectors.toList()); 
stockList2.forEach(System.out::println); 

あなたは任意のオブジェクトを変異されていません。 Stringは既に変更不可能です(は必要ありません)。ListstockList)は、出力ListstockList2)の作成によって変更されていません。