Java
 Computer >> コンピューター >  >> プログラミング >> Java

Java 9のCollectors.flatMapping()メソッドとは?重要性と使い方を解説

Java 9では、Collectorsクラスに新しいメソッドflatMapping()が追加されました。このメソッドは既存のCollectors.mapping()メソッドとよく似ていますが、ネストした(入れ子になった)コレクションを直接扱える点が大きな違いです。

Collectors.flatMapping()は、入力要素に適用する関数と、その関数を通過した要素を蓄積するための下流コレクタ(downstream collector)を受け取ります。mapping()との決定的な違いは、flatMapping()が要素のストリームそのものを扱うため、不要な中間コレクションを排除できることです。これにより、より簡潔で効率的なデータ処理が実現できます。

構文

public static <T,U,A,R> Collector<T,?,R> flatMapping(
    Function<? super T, ? extends Stream<? extends U>> mapper,
    Collector<? super U,A,R> downstream)

コード例

import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.Collection;
import java.util.List;
import java.util.Map;

public class FlatMappingMethodTest {
   public static void main(String args[]) {
      Map<Integer, List<Integer>> map = Stream.of(List.of(1, 2, 3, 4, 5, 6), List.of(7, 8, 9, 10))
         .collect(Collectors.groupingBy(
            Collection::size,
            Collectors.flatMapping(
               l -> l.stream()
                     .filter(i -> i % 2 == 0),
               Collectors.toList())
         )
      );
      System.out.println(map);
   }
}

実行結果

{4=[8, 10], 6=[2, 4, 6]}

処理の流れの解説

この例では、6個の要素を持つリストと4個の要素を持つリストの2つを用意し、groupingBy()によってリストのサイズ(要素数)ごとにグループ化しています。各グループ内では、flatMapping()が各リストをストリームへ変換し、偶数のみをフィルタリングした上で、1つのリストにまとめます。

その結果、サイズ6のグループには [2, 4, 6]、サイズ4のグループには [8, 10] という偶数だけのリストが格納されます。

もしflatMapping()の代わりにmapping()を使用すると、各グループは「ストリームのリスト」というネスト構造になってしまい、後続の処理で余分な変換が必要になります。flatMapping()はこのような入れ子構造を自動的に平坦化(フラット化)してくれるため、コードがシンプルになり、可読性とパフォーマンスの両面でメリットがあります。複数階層のコレクションを集計・分類する場面では、Java 9以降のストリーム処理において非常に有用なメソッドといえます。

  1. JavaScriptの_.without()メソッドとは?配列から指定した値を除外する方法

    JavaScriptで配列を操作する際、特定の値だけを取り除いた新しい配列を作りたいケースはよくあります。そんなときに便利なのが、Underscore.jsなどのユーティリティライブラリが提供する_.without()メソッドです。_.without()メソッドの概要_.without()は、第1引数に渡された配列から、第2引数以降で指定した要素をすべて除外し、その結果を新しい配列として返します。このメソッドには以下のような特徴があります。2つのパラメータを受け取る:第1パラメータが対象の配列、第2パラメータが取り除きたい値です。trueやfalseを問わず処理する:値の真偽を判断せず、各要素

  2. Java 9のdestroyForcibly()メソッドとは?プロセスを強制終了する方法を解説

    destroyForcibly() メソッドは、実行中のプロセスを強制的に終了(キル)するために使用されます。このメソッドは、プロセスが正常に終了しない場合や、フリーズ(応答停止)してしまった場合に特に役立ちます。 例えば、destroyForcibly() を呼び出した後でも isAlive() メソッドが true を返すことがあります。これは、OSレベルでの終了処理が完了するまでに時間差があるためです。また、destroyForcibly() は終了要求が正常に受け付けられた場合は true を返し、そうでない場合は false を返します。 構文 boolean destroyForc