ホームページ > Java > &#&チュートリアル > Java9 ストリーム コレクターの新機能の使用方法

Java9 ストリーム コレクターの新機能の使用方法

WBOY
リリース: 2023-04-19 15:57:29
転載
959 人が閲覧しました

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート