Java Predication 2 C開発者


Java Predicatビュー2
Predicateのデフォルト値は前回発表された記事で作成され、default関数はpredicateで作成されますか?コンフィギュレーション
「and,or,negate,isEqual,not」の5つの関数のテスト例が終了します.
まず昨日文章を書く前に気づかなかった部分ですが、predicateを見てもう一度よく見ました.
notは内部でnegateを呼び出し、結果が同じ関数であることを確認しました.

実際には、next()を内部で呼び出すコードを表示できます.
したがって、確認する必要がある関数は次の4つです.
和:条件1+条件2
or:条件1 OR条件2
negate : !(条件)「事前に否定する
isEqual:同等演算
まず比較的認識しやすいand orの演算を決定する
public static void main(String[] args) {
        Predicate<Integer> pre1 = i -> (i%2) == 0;
        Predicate<Integer> pre2 = i -> i >= 5;
        Predicate<Integer> pre3 = i -> i == 7;

        System.out.println("---------- and or ------------");
        //(짝수 and 5크고) OR 7
        var allpredicate = pre1.and(pre2).or(pre3);
        System.out.println(allpredicate.test(3)); //false
        System.out.println(allpredicate.test(7)); //true
        System.out.println(allpredicate.test(8)); //true
        System.out.println(allpredicate.test(10)); //true

        System.out.println("---------- negate ------------");
        var not_allpredicate = allpredicate.negate();
        System.out.println(not_allpredicate.test(3)); //false
        System.out.println(not_allpredicate.test(7)); //true
        System.out.println(not_allpredicate.test(8)); //true
        System.out.println(not_allpredicate.test(10)); //true



        System.out.println("---------- isEqual ------------");
        List<Integer> list = Arrays.asList(1,2,3,4,5);

        var filterList = list.stream().filter(Predicate.isEqual(5)).map(Integer::new).collect(Collectors.toList());
        //var filterList = list.stream().filter(r -> r==5).map(Integer::new).collect(Collectors.toList());
        System.out.println(filterList.size());//1

    }
条件式
条件1:偶数
条件は2:5以上です.
条件3:7なら.
nextの条件式は、(and or)条件式のすべての逆の値を表します.
isEqualの式はfilterで同じですが、Predicateで表さなければなりません.
lamdaより文法表現が少し面倒です.
次の注記で示すr->r=5を使用する方法で、なぜEqualの式を使用できないのか分からないかもしれませんが、ReferenceEqualを回避するためにGenericオブジェクトEqualを呼び出す方法の1つです.と思います.
出力結果は次のとおりです.

c#のテストコードにも大きな違いはありません.以下に示します.
namespace ConsoleApp1
{

    class Program
    {
        public delegate bool Test(int i);

        static void Main(string[] args)
        {
            Func<int, bool> func1 = i => (i%2) == 0;
            Func<int, bool> func2 = i => i >= 5;
            Func<int, bool> func3 = i => i == 7;

            var andFunc = func1 + func2;


            Console.WriteLine("------------ and or -------------");
            Console.WriteLine(andFunc(3) || func3(3));
            Console.WriteLine(andFunc(7) || func3(7));
            Console.WriteLine(andFunc(8) || func3(8));
            Console.WriteLine(andFunc(10) || func3(10));

            Console.WriteLine("------------ not -------------");
            Console.WriteLine(!(andFunc(3) || func3(3)));
            Console.WriteLine(!(andFunc(7) || func3(7)));
            Console.WriteLine(!(andFunc(8) || func3(8)));
            Console.WriteLine(!(andFunc(10) || func3(10)));


            List<int> list = new List<int>{1,2,3,4,5};
            list.Where(r => r == 5);
        }
    }
}
2つのコードの最大の違いは、C#のdelegateフィーチャーが+-式のマージ演算とマイナス符号連写であることです.
このほか、and orは、コードでなくても一般if文の&&,|演算に使用できます.
not演算かifで使用される否定演算か!簡単で実行可能です.
コードの可読性は、一般的なif文でより一般的に用いられる構文を用いることができる.これは、C#が同様にやや単純な構文であると考えられるが、この部分の言語設計の特性も制限され、詳細は不明であるが、C#のlinqのようなand or not演算をコード連続性をより良く行うためのコードであるインタフェースを構成したと思います.
Java CollectionとStreamについては、コードの2~3日目から議論し、インタフェースを通じて依頼がないという欠点を克服しました.
ここまで予習の締めくくりです