ストリームの使用方法の概要:
計算の構造:
副作用:
例 1: 副作用のあるコード
Map<String, Long> freq = new HashMap<>(); try (Stream<String> words = new Scanner(file).tokens()) { words.forEach(word -> { freq.merge(word.toLowerCase(), 1L, Long::sum); }); }
問題: このコードは、forEach を使用して外部状態 (freq) を変更します。これは反復的であり、ストリームを利用しません。
例 2: 副作用のないコード
Map<String, Long> freq; try (Stream<String> words = new Scanner(file).tokens()) { freq = words.collect(Collectors.groupingBy(String::toLowerCase, Collectors.counting())); }
解決策: Collectors.groupingBy コレクターを使用して、外部状態を変更せずに頻度テーブルを作成します。より短く、明確で、より効率的です。
ストリーム API の流用:
コレクター:
例 3: 最も頻繁に使用される 10 個の単語のリストを抽出する
List<String> topTen = freq.entrySet().stream() .sorted(Map.Entry.<String, Long>comparingByValue().reversed()) .limit(10) .map(Map.Entry::getKey) .collect(Collectors.toList());
説明:
コレクター API の複雑さ:
マップと収集戦略:
例 4: マージ関数で toMap を使用する
Map<String, Long> freq; try (Stream<String> words = new Scanner(file).tokens()) { freq = words.collect(Collectors.toMap( String::toLowerCase, word -> 1L, Long::sum )); }
説明:
例 5: アーティストごとにアルバムをグループ化し、最も売れているアルバムを見つける
Map<Artist, Album> topAlbums = albums.stream() .collect(Collectors.toMap( Album::getArtist, Function.identity(), BinaryOperator.maxBy(Comparator.comparing(Album::sales)) ));
説明:
文字列コレクション:
Collectors.joining は、文字列をオプションの区切り文字で連結します。
例 6: 区切り文字を使用した文字列の連結
String result = Stream.of("came", "saw", "conquered") .collect(Collectors.joining(", ", "[", "]"));
説明:
結論:
以上が項目 ストリーム内で副作用のない関数を優先するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。