logo

Java 8 の anyMatch()

Java 8 では、anyMatch() は Stream インターフェースで定義されたメソッドです。それは、 端子短絡動作。 このセクションでは、 Java 8 Stream の anyMatch() メソッド 例を挙げて説明します。本題に進む前に、まず中間操作と末端操作を詳しく理解します。

Java 8 ストリームでは、ストリーム操作は次のように分割されます。 中級 (Stream.filter、Stream.map など) ターミナル (Stream.forEach、Steam.reduce など) オペレーション。望ましい結果を得るには、ストリーム パイプラインを形成するこれらの操作を組み合わせる必要があります。

中間操作

中間操作は本質的に遅延的です (実際の操作を実行せず、代わりに新しいストリームを返すことを意味します)。これは、初期ストリームの要素を保持し、常に初期ストリームの新しいストリームを返すことを意味します。パイプラインの実行は、パイプラインの最終操作が実行されるまで開始されないことに注意してください。

中間操作はさらに次のように分類されます。 ステートレス 操作 (フィルターやマップなど) と ステートフル 操作 (distinct やsorted など)。

ステートレスな操作

ステートレス操作では、新しい要素の処理中に、以前に表示された要素の状態が保持されません。各要素は、他の要素に対する操作とは独立して処理できます。

Java トライキャッチ

ステートフル操作

ステートフル操作は、新しい要素を処理する間、以前に表示された要素の状態を保持します。ステートフル操作の特性は、結果を生成する前に入力全体を処理することです。

ストリームに対してソート操作を実行しており、ストリームのすべての要素を確認せずにそのストリームから結果を生成したいとします。これは不可能です。したがって、ストリームのすべての要素が表示されない限り、結果を生成することはできません。したがって、結果を生成する前に入力全体を処理する必要があります。

端末操作

端末操作はストリームを横断して結果または副作用を生成します。ターミナル操作が実行されるとすぐに、ストリーム パイプラインが消費されたとみなされます。消費後は使用できなくなります。場合によっては、同じデータ ソース (ストリーム) をトラバースする必要がある場合は、ストリームを返して新しいストリームを取得します。

ほとんどすべての端末操作は本質的に熱心です。つまり、ストリームを横断し、戻る前にパイプラインを処理します。 2 つの端末操作、つまり iterator() と spliterator() では許可されないことに注意してください。

上記の操作の他に、次の操作があります。 短絡 手術。中間動作、終端動作ともにショートする可能性があります。

の Java インスタンス

アン 中間操作 無限入力のストリームがある場合は短絡します。結果として、有限のストリームが生成される可能性があります。

端末操作 無限入力のストリームがある場合は短絡します。一定時間内に終了する場合があります。

パイプラインで短絡操作を使用することは必須ですが、十分ではないことがわかりました。無限ストリームを処理するには条件があります。 有限時間内に操作を正常に終了します。

Java 8 Stream.anyMatch()

このストリームの要素が指定された述語と一致するかどうかを返します。結果を決定するために必要でない場合は、すべての要素の述語を評価しない場合があります。

typescript foreach

構文:

 boolean anyMatch(Predicate predicate) 

パラメーター: それは受け入れます 干渉しない そして ステートレス 入力ストリームの要素に適用される述語。

戻り値: 戻ります 真実 いずれかの要素が指定された述語に一致する場合、それ以外の場合は false を返します。ストリームが空の場合は false を返します。空のストリームの場合、述語は評価されません。

Java anyMatch() の例

AnyMatchExample1.java

Java乱数ジェネレーター
 import java.util.stream.Stream; public class AnyMatchExample1 { public static void main(String args[]) { Stream stream = Stream.of('Java', 'Python', 'Hadoop', 'C#', 'C++', 'Kotlin'); boolean match = stream.anyMatch(s -> s.contains('Python')); System.out.println(match); } } 

出力:

 true 

次の例は、空のストリームが常に false を返すことを示しています。

AnyMatchExample2.java

 import java.util.Arrays; public class AnyMatchExample2 { public static void main(String args[]) { boolean b = Arrays.asList().stream().anyMatch(e -> true); System.out.println(b); } } 

出力:

 false 

複数の述語を解析した別の Java プログラムを見てみましょう。

命題論理

複数の条件を満たすには、2 つ以上の単純な述語を含む合成述語を作成します。この例では、従業員のリストがあります。年齢が 28 歳で名前がアルファベット R で始まる従業員がいるかどうかを確認したいと考えています。次の Java プログラムは同じことを示しています。

AnyMatchExample.java

 import java.util.List; import java.util.function.Predicate; import java.util.ArrayList; class Employee { int empId; int empAge; String empName; //creating a constructor of the Employee class Employee(int id, int age, String name) { this.empId = id; this.empAge = age; this.empName = name; } public int getEmpId() { return empId; } public int getEmpAge() { return empAge; } public String getEmpName() { return empName; } public static List getEmployee() { //instance of the List class List list = new ArrayList(); //adding elements to the List list.add(new Employee(21, 21, &apos;Andrew&apos;)); list.add(new Employee(23, 28, &apos;Robert&apos;)); list.add(new Employee(32, 29, &apos;Jack&apos;)); list.add(new Employee(12, 31, &apos;Steve&apos;)); list.add(new Employee(15, 27, &apos;Tom&apos;)); list.add(new Employee(19, 29, &apos;Albert&apos;)); return list; } } //driver code public class AnyMatchExample { public static void main(String args[]) { //defining predicates Predicate p1 = e -&gt; e.empName.startsWith(&apos;S&apos;); Predicate p2 = e -&gt; e.empAge <28 && e.empname.startswith('r'); predicate p3="e" -> e.empName.startsWith(&apos;P&apos;); List list = Employee.getEmployee(); //anyMatch() method checks whether any Stream element matches the specified predicate boolean bool1 = list.stream().anyMatch(p1); //prints true if any element of the List starts with the letter s, else prints false System.out.println(bool1); boolean bool2 = list.stream().anyMatch(p2); //prints true if any element of the List starts with the letter z and age is less than 28, else prints false System.out.println(bool2); //anyMatch() method checks whether any Stream element matches the specified predicate boolean bool3 = list.stream().anyMatch(p3); //prints true if any element of the List starts with the letter P, else prints false System.out.println(bool3); } } </28>

出力:

 true true false 

Stream インターフェースは、指定された述語を照合するための別のメソッドを提供します。 allMatch() 。 allMatch() と anyMatch() の違いは、anyMatch() が返すことです。 真実 ストリーム内のいずれかの要素が指定された述語に一致する場合。 allMatch() を使用する場合、すべての要素が指定された述語に一致する必要があります。

したがって、ストリーム内に少なくとも 1 つの要素があるかどうかを確認したい場合には、anyMatch() メソッドを使用できます。 List クラスの contains() メソッドも同じ操作を実行します。したがって、anyMatch() メソッドの代わりに contains() メソッドを使用することもできます。

したがって、List.contains() メソッドと Stream.anyMatch() メソッドの間に違いはありません。