Java の Predicate とは

Mohammad Irfan 2023年10月12日
  1. Java の Predicate とは
  2. Filter() の Predicate Java ストリームの操作
Java の Predicate とは

このチュートリアルでは、Java の例を使用して Predicate インターフェースを紹介します。

Predicate は、ラムダ式またはメソッド参照のターゲット割り当てとして使用される Java のインターフェースです。これは Java 8 に追加され、Java でコードを記述するためのより機能的なアプローチを提供しました。

java.util.function パッケージに含まれています。Predicate は、オブジェクトのストリームをフィルタリングするために最も一般的に使用されます。このチュートリアルでは、Predicate とは何か、およびその使用方法について説明します。

Java の Predicate とは

前に説明したように、Predicate はラムダ式またはメソッド参照の割り当てターゲットとして使用される関数型インターフェースです。Predicate インターフェースの構文は次のようになります。

@FunctionalInterface public interface Predicate<T>

T は、Predicate インターフェースへの入力のタイプです。Predicate とは何かを例にとってみましょう。数学の世界では、Predicate は次の形式をとることができます。

x -> x > 90

上記のステートメントは、xx90 より大きいことを意味することを表しています。

Predicate オブジェクトを作成する方法の例を見てみましょう。

Predicate<Integer> noGreaterThan5 = x -> x > 5;

上記のコードでは、noGreaterThan5 という名前の Predicate を作成します。この Predicate は整数入力を取ります。したがって、ここでは T は整数です。この Predicate は、入力引数が 5 より大きいかどうかをチェックします。

Filter() の Predicate Java ストリームの操作

Java 8 ストリーム API の filter() 操作は、引数として Predicate を取ります。以下のコードでは、filter() 操作を使用して、Predicate インターフェースの実装を確認します。以下のコードを見てください。

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class SimpleTesting {
  public static void main(String args[]) {
    // predicate
    Predicate<String> nameGreaterThan4 = x -> x.length() > 4;
    // Create a list
    List<String> name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav");
    // create a stream
    // apply filter operation
    // pass the predicate
    List<String> name_filtered =
        name.stream().filter(nameGreaterThan4).collect(Collectors.toList());
    // print the resulting list
    System.out.println(name_filtered);
  }
}

出力:

[Karan, Aarya, Rahul, Pranav]

上記のコードを記述して、長さが 4 より大きい名前をフィルター処理します。最初に、名前を格納するための Predicate とリストを作成します。

次に、List.toStream() メソッドを使用して名前のストリームを作成し、filter() 操作を適用します。フィルタ操作は、引数として nameGreaterThan4 Predicate を取ります。

この述部を使用したフィルター操作では、長さが 4 より大きい文字列のみが許可されました。Predicate に一致する文字列は、最終的に収集操作によって収集され、リストに格納されました。

Predicate オブジェクトを個別に作成する代わりに、Predicate をフィルター関数に直接渡すことができます。以下のコードを見てください。

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class SimpleTesting {
  public static void main(String args[]) {
    // Create a list
    List<String> name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav");
    // create a stream
    // apply filter operation
    // pass the predicate
    List<String> name_filtered =
        name.stream().filter(x -> x.length() > 4).collect(Collectors.toList());
    // print the resulting list
    System.out.println(name_filtered);
  }
}

出力:

[Karan, Aarya, Rahul, Pranav]

Java の Predicate.and() メソッド

Predicate.and() メソッドを使用して、2つの Predicate をフィルター操作に適用できます。これは、これの論理 AND を反映し、別の Predicate を短絡する複合 Predicate を返します。

複合 Predicate を評価するときにこの Predicate が false の場合、他の Predicate は評価されません。このメソッドのメソッドシグネチャは次のとおりです。

default Predicate<T> and(Predicate<? super T> other)

引数の他の部分は、2 番目の Predicate を参照しています。これを適用することをお勧めします。この方法について学ぶために、いくつかの例を見てみましょう。以下のコードを見てください。

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class SimpleTesting {
  public static void main(String args[]) {
    // predicate
    Predicate<String> nameGreaterThan3 = x -> x.length() > 3;
    Predicate<String> nameLesserThan5 = x -> x.length() < 5;
    // Create a list
    List<String> name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav", "Alok");
    // create a stream
    // apply filter operation
    // pass the predicate
    List<String> name_filtered =
        name.stream().filter(nameGreaterThan3.and(nameLesserThan5)).collect(Collectors.toList());
    // print the resulting list
    System.out.println(name_filtered);
  }
}

出力:

[Alok]

上記のコードでは、最初の Predicate は文字列の長さが 3 より大きいかどうかをチェックし、2 番目の Predicate は文字列の長さが 5 より小さいかどうかをチェックします。これらの Predicate が両方とも AND 操作でフィルター操作に渡されると、長さが 4 に等しい名前をフィルタリングします。

上記のコードは、次のように簡潔に記述できます。

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class SimpleTesting {
  public static void main(String args[]) {
    // create a list
    List<String> name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav", "Alok");
    // create a stream
    // apply filter operation
    // pass the predicate
    List<String> name_filtered =
        name.stream().filter(x -> x.length() > 3 && x.length() < 5).collect(Collectors.toList());
    // print the resulting list
    System.out.println(name_filtered);
  }
}

出力:

[Alok]

Java の Predicate.or() メソッド

前の説明と同様に、and() メソッドを使用して AND 操作を適用しました。or() メソッドを使用して OR 操作を適用することもできます。

これは、これと短絡している別の Predicate の論理 OR を反映する複合 Predicate を返します。この Predicate が true の場合、複合 Predicate を評価する際に他の Predicate は考慮されません。

このメソッドのメソッドシグネチャは次のとおりです。

default Predicate<T> or(Predicate<? super T> other)

引数の他の部分は、2 番目の Predicate を参照しています。これを適用することをお勧めします。この方法について学ぶために、いくつかの例を見てみましょう。以下のコードを見てください。

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class SimpleTesting {
  public static void main(String args[]) {
    // predicate
    Predicate<String> nameEqualTo3 = x -> x.length() == 3;
    Predicate<String> nameEqualTo2 = x -> x.length() == 2;
    // Create a list
    List<String> name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav", "Alok");
    // create a stream
    // apply filter operation
    // pass the predicate
    List<String> name_filtered =
        name.stream().filter(nameEqualTo3.or(nameEqualTo2)).collect(Collectors.toList());
    // print the resulting list
    System.out.println(name_filtered);
  }
}

出力:

[Ram, Om]

上記のコードでは、最初の Predicate は文字列の長さが 3 に等しいかどうかをチェックし、2 番目の Predicate は文字列の長さが 5 に等しいかどうかをチェックします。長さが 3 または 2 に等しい名前をフィルター処理します。

上記のコードは、次のように簡潔に記述できます。

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class SimpleTesting {
  public static void main(String args[]) {
    // Create a list
    List<String> je_name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav", "Alok");
    // create a stream
    // apply filter operation
    // pass the predicate
    List<String> je_name_filtered = je_name.stream()
                                        .filter(x -> x.length() == 3 || x.length() == 2)
                                        .collect(Collectors.toList());
    // print the resulting list
    System.out.println(je_name_filtered);
  }
}

出力:

[Ram, Om]

関連記事 - Java Interface