Java 9 ストリーム コレクターの新機能
Java 8 では、入力要素を Map、List、Set などの変更可能なコンテナーに蓄積するために使用されるコレクターが導入されました。この記事では、Java 9 の 2 つの新しいコレクタ、Collectors.filtering と Collectors. flatMapping について説明します。これらは主に、Collectors.groupingBy.
Collectors とともにインテリジェントな要素コレクションを提供するために使用されます。 filtering メソッド
Collectors.filtering メソッドは、入力要素をフィルタリングするために使用される Stream filter() メソッドに似ていますが、この 2 つの使用シナリオは異なります。 Stream filter() はストリーム チェーン メソッドで使用されますが、Collectors.filtering メソッドは groupingBy で使用するように設計されています。
Stream filter() は、まず要素をフィルタリングしてから、要素をグループ化します。フィルタリングされた値は破棄され、遡って追跡することはできません。最初にグループ化してからフィルタリングする必要があるものを追跡する必要がある場合、それがまさに Collectors.filtering で実行できます。
Collectors.filtering は、関数パラメーターを取得して入力パラメーターをフィルターし、フィルターされた要素を収集します。
@Test public void givenList_whenSatifyPredicate_thenMapValueWithOccurences() { List<Integer> numbers = List.of(1, 2, 3, 5, 5); Map<Integer, Long> result = numbers.stream() .filter(val -> val > 3) .collect(Collectors.groupingBy(i -> i, Collectors.counting())); assertEquals(1, result.size()); result = numbers.stream() .collect(Collectors.groupingBy(i -> i, Collectors.filtering(val -> val > 3, Collectors.counting()))); assertEquals(4, result.size()); }
Collectors. flatMapping メソッド
Collectors . flatMapping は Collectors.mapping メソッドに似ていますが、より詳細です。どちらも要素を収集するために関数とコレクター パラメーターを受け取りますが、 flatMapping 関数は要素のストリームを受け取り、コレクターを通じて累積操作を実行します。まず、モデル クラスを見てみましょう:
class Blog { private String authorName; private List<String> comments = new ArrayList<>(); public Blog(String authorName, String ... comment){ this.authorName = authorName; comments.addAll(Arrays.asList(comment)); } public String getAuthorName(){ return this.authorName; } public List<String> getComments(){ return comments; } }
Collectors. flatMapping メソッドは中間コレクションをスキップし、Collectors.groupingBy で定義された単一のグループ マッピング コンテナーに直接書き込みます:
@Test public void givenListOfBlogs_whenAuthorName_thenMapAuthorWithComments() { Blog blog1 = new Blog("1", "Nice", "Very Nice"); Blog blog2 = new Blog("2", "Disappointing", "Ok", "Could be better"); List<Blog> blogs = List.of(blog1, blog2); Map<String, List<List<String>>> authorComments1 = blogs.stream() .collect(Collectors.groupingBy(Blog::getAuthorName, Collectors.mapping(Blog::getComments, Collectors.toList()))); assertEquals(2, authorComments1.size()); assertEquals(2, authorComments1.get("1").get(0).size()); assertEquals(3, authorComments1.get("2").get(0).size()); Map<String, List<String>> authorComments2 = blogs.stream() .collect(Collectors.groupingBy(Blog::getAuthorName, Collectors.flatMapping(blog -> blog.getComments().stream(), Collectors.toList()))); assertEquals(2, authorComments2.size()); assertEquals(2, authorComments2.get("1").size()); assertEquals(3, authorComments2.get("2").size()); }
Collectors.mapping マップすべてのグループ (作成者のコメント) 値はリストなどのコンテナに収集されます。そして、中間コレクションを削除し、コレクションをコレクターのコンテナーに直接保存します。
以上がJava9 ストリーム コレクターの新機能の使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。