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
上記のステートメントは、x
が x
が 90
より大きいことを意味することを表しています。
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]