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

Java 9で追加されたCollectors.filtering()メソッドとは?使い方とgroupingBy()との違いを解説

Collectorsクラスは、JavaのStream APIにおいて欠かせない重要なクラスの一つです。Java 9では、このCollectorsクラスに新しいメソッドfiltering()が追加されました。このメソッドを使うと、ストリーム内の要素を柔軟にフィルタリングできます。

filtering()メソッドとfilter()メソッドの違い

一見すると、filtering()はストリームのfilter()メソッドと似た動作をするように思えます。しかし、両者には決定的な違いがあります。

  • filter()メソッド:要素がグループ化されるに値を処理します。
  • filtering()メソッドCollectors.groupingBy()メソッドと組み合わせることで、グループ化を先に行い、その後にフィルタリングを行えます。

つまり、グループごとの空リストを保持したい場合や、グループ化の結果に対して条件付きの絞り込みを行いたい場合には、filtering()メソッドが非常に有効です。

構文

public static <T, A, R> Collector<T, ?, R> filtering(Predicate<? super T> predicate,
                                                     Collector<? super T, A, R> downstream)

第一引数にはフィルタリング条件となるPredicateを、第二引数にはダウンストリームのCollectorを指定します。

使用例

以下のコードでは、文字列のリストを長さごとにグループ化し、さらに「z」を含まない文字列だけを抽出しています。

import java.util.stream.*;
import java.util.*;

public class FilteringMethodTest {
    public static void main(String args[]) {
        List<String> list = List.of("x", "yy", "zz", "www");

        Map<Integer, List<String>> result = list.stream()
                .collect(Collectors.groupingBy(String::length,
                        Collectors.filtering(s -> !s.contains("z"),
                                Collectors.toList())));

        System.out.println(result);
    }
}

実行結果

{1=[x], 2=[yy], 3=[www]}

この例では、まず文字列の長さ(1、2、3)をキーとしてグループ化が行われ、その後、各グループ内で「z」を含む要素("zz")が除外されています。もし通常のfilter()メソッドを使った場合、「zz」が除外された時点でキー「2」のグループ自体が存在しなくなります。しかし、filtering()を使えば、{2=[]}のように空のリストを持つグループも保持できるため、より意図に沿ったデータ処理が可能になります。

  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