JDKは、ラムダ典型的な使用シナリオを豊かにする共通インタフェース機能の数を提供し、それらは主に java.util.functionパッケージを供給する。以下は述語インターフェースの使用の簡単な例です。
述語インターフェイスの概要
時々 、私たちは、それによって、ブール結果を得るために、特定のタイプのデータのために決定する必要があります。そして、あなたはjava.util.function.Predicate <T>を使用することができますインターフェイスを。
抽象メソッド:テスト
述語ブールテスト(T T):インターフェイスは、抽象メソッドを含みます。シーンを決定するための条件:
輸入java.util.function.Predicate; パブリック クラスDemo01Predicate { 公共 静的 ボイドメイン(文字列[]引数){ メソッド(S - > s.length()> 5 )。 } プライベート 静的 ボイド方法(述語の<string> 述語){ ブール veryLong = predicate.test( "HelloWorldの" )。 System.out.println( "字符串很长吗:" + veryLong)。 } }
プログラム、コンソール出力を実行します。
文字列は長く実行します。trueに
条件付きの標準ロジックは限り文字列の長さが5以上であるように、非常に長いと考えられ、ラムダ式を渡されます。
デフォルトの方法:と
それは条件付きであるので、それはない3つの一般的なロジックを存在し、又はう。前記2 条件は述語を使用「および」論理接続が一緒に実装「および」実質的に、デフォルトの方法を使用し、。そのためのJDKのソースコード:
デフォルトの述語<T>と(述語<?スーパー T> その他){ Objects.requireNonNull(他の); リターン(T) - >試験(T)&& other.test(T)。 }
文字列が両方とも大文字の「H」が含まれているかどうかを判断するには、だけでなく、その後、「W」大文字が含まれます。
インポート; java.util.function.Predicate パブリック クラスDemoPredicateAnd { 公共 静的 ボイドメイン(文字列[]引数){ ブールのisValid = 法( // この値文字列は、指定された配列を含むString.Contains()メソッドは、ときにのみtrueに戻ります。 S - > s.contains( "H" )、 S - > s.contains( "Wがある" ) ); System.out.printlnは( "文字列が要件を満たしてやる:" + のisValidを); } プライベート 静的 ブール方法(述語の<string>一方、述語の<string> TWO){ ブールisValid = one.and(2).TEST( "こんにちは世界" ); 返すのisValidを。 } }
プログラム、コンソール出力を実行します。
文字列は、要件を満たして行います。偽の
デフォルトの方法:または
そして、そして「と」同様に、デフォルトの方法またはロジックで実装さ「や」。JDKのソースコードのために:
デフォルトの述語<T>または(述語<?スーパー T> その他){ Objects.requireNonNull(他の); リターン(T) - >テスト(T)|| (T)other.test。 }
あなたは論理H「の文字列が大文字が含まれ、」「または大文字が含まれている」W実現したい場合は、「そしてだけに必要なコード」およびその他に名前」または 『に変更するには、』同じです。
インポート; java.util.function.Predicate パブリック クラスDemoPredicateOr { 公共 静的 ボイドメイン(文字列[]引数){ ブールのisValid = 法( // この値文字列は、指定された配列を含むString.Contains()メソッドは、ときにのみtrueに戻ります。 S - > s.contains( "H" )、 S - > s.contains( "Wがある" ) ); System.out.printlnは( "文字列が要件を満たしてやる:" + のisValidを); } プライベート 静的 ブール方法(述語の<string>一方、述語の<string> TWO){ ブールisValid = one.or(2).TEST( "こんにちは世界" ); 返すのisValidを。 } }
プログラム、コンソール出力を実行します。
文字列は、要件を満たして実行します。trueに
デフォルトの方法:ネゲート
「AND」、「OR」を学びました、残りの「非」(反転)はシンプルになります。デフォルトの方法は、JDKのソースコードを否定します:
デフォルトの述語<T> 否定(){ リターン(T) - >!試験(T)。 }
それは実装から見やすいしたら、それはテストを実行するための方法であり、ブール値「!」の結果が代わりに取られて。必ずテストメソッドの前に呼び出します
コールとして、否定の方法をとし、またはメソッドとして:
輸入java.util.function.Predicate; パブリック クラスDemoPredicateNegate { 公共 静的 ボイドメイン(文字列[]引数){ メソッド(S - > s.length()> 5 )。 } プライベート 静的 ボイド方法(述語の<string> 述語){ ブール veryLong = predicate.negate()試験( "HelloWorldの"。 )。 System.out.println( "字符串很长吗:" + veryLong)。 } }
プログラム、コンソール出力を実行します。
長い文字列を:偽
演習:情報フィルタリングのコレクション
タイトル
以下の情報の「名前+性別」の数の配列の中に、してください述語インタフェースはの要件を満たします文字列のコレクションアセンブルするためにスクリーニングのArrayListを、次の2つの条件を満たしている必要があります。
女の子のための1.必要があります。
2.名前4つの単語。
文字列[]配列= { "ディリーレバ、F"、 "GülnezerBextiyar、女性"、 "マーJAH、M"、 "趙麗穎、F"}。
答え
インポートjava.util.ArrayList内の、 インポートjava.util.Listに、 インポートjava.util.function.Predicate、 パブリック クラスDemoPredicate { 公共 静的 ボイドメイン(文字列[]引数){ 文字[]配列 = {「ディリーレバ、女性"" GülnezerBextiyar、女性""マーJAH、M ""趙麗穎、F " }; リストの<string>一覧= フィルタ( アレイ、 S - >" F」.equals(s.split( [1 " ")])、 S - > s.split("、")[0] .LENGTH()== 4 ) のSystem.out.println(リスト) } プライベート 静的リストの<string>フィルタ(文字列[]配列、述語の<string> 1、述語の<string> 2){ リストの<string>リスト= 新規のArrayList <> (); 用{(配列文字列情報) であれば(one.and(2).TEST(情報)){ list.add(情報)。 } } 戻り値のリスト。 } }