【Javaの始まりから終わりまで】No12.JDK1.8 関数型プログラミング 関数型インターフェース

1。概要

  • 概念:
    唯一の抽象メソッドを備えたインターフェイス
  • インターフェイスが関数型インターフェイスであるかどうかを検出する方法
    @FunctionalInterfaceインターフェイスは
    インターフェイス定義の上に配置されます。インターフェイスが関数型インターフェイスの場合はコンパイルに合格し、そうでない場合はコンパイルに失敗します。
  • 概要:
    1 つのことを行うことに重点を置いたインターフェイスである lambda に適しています。

2. よく使われるインターフェース↓↓↓

関数型インターフェイスとラムダ式の出現後、Java はいくつかの操作 (ストリーム操作をサポート) を完了するためのいくつかの単純な関数型インターフェイスを公式に提供します。これらのインターフェイスはストリーム操作で使用するため、これらの使用方法を学習してください。インターフェイスは前提条件です。これについては、後の Stream の研究でも触れます。

3.サプライヤーインターフェース

  • 説明する

サプライヤー: サプライヤー
私はこれをプロバイダー インターフェイスと呼び、その機能メソッドはT get ()です。
インスタンスが構築され、インターフェイス実装で返されます。
ここに画像の説明を挿入します

  • コード: T get()
public class Supplier_Practice {
    
    

    public static void main(String[] args) {
    
    
        String str = getString(() -> {
    
    
           return "supplier interface";
        });
        System.out.println(str);
    }

    private static String getString(Supplier<String> stringSupplier) {
    
    
        return stringSupplier.get();
    }

}

4.消費者インターフェース

  • 説明する

Consumer: Consumer
私はこれをユーザー インターフェイスと呼び、その機能メソッドはvoid accept (object)です。
パラメータを渡して操作し、値を返しません。
ここに画像の説明を挿入します

  • コード: void accept (オブジェクト)
public class Consumer_Practice {
    
    

    public static void main(String[] args) {
    
    

        String str = "chenfeilin";
        consumerString((String s) -> {
    
    
            System.out.println(s.toUpperCase());
        }, str);

    }

    private static void consumerString(Consumer<String> stringConsumer, String str) {
    
    
        stringConsumer.accept(str);
    }

}

  • コード: andThen(Consumer<? super T> after) は、
    合成された Consumer を返し、この操作を順番に実行してから、after 操作を実行します。
// 一个简单的实体类
public class Student {
    
    

    private String name;
    private int age;
    private String address;

    public Student() {
    
    
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public int getAge() {
    
    
        return age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }

    public String getAddress() {
    
    
        return address;
    }

    public void setAddress(String address) {
    
    
        this.address = address;
    }

    @Override
    public String toString() {
    
    
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
}

public class Consumer_Practice {
    
    

    public static void main(String[] args) {
    
    

        Student student = new Student();
        consumerTwo((Student s1) -> {
    
    
            s1.setName("chenfeilin");
        }, (Student s2) -> {
    
    
            s2.setAddress("雷克雅未克");
            s2.setAge(777);
        }, student);
        System.out.println(student);

    }

    private static void consumerTwo(Consumer<Student> stringConsumer1,
                                    Consumer<Student> stringConsumer2, Student student) {
    
    
        // 依次消费
        stringConsumer1.andThen(stringConsumer2).accept(student);
    }

}

コンソール出力:

学生{名前='チェンフェイリン'、年齢=777、住所='レイキャビク'}

  • :
    String 型の場合、このコンシューマーの結果は元の参照の値に反映されません。サンプルコードを見てみましょう。
public class Consumer_Practice {
    
    

    public static void main(String[] args) {
    
    

        String str = "chenfeilin";
        consumerString((String s) -> {
    
    
            s = s.toUpperCase();
            System.out.println(s);
        }, str);
        System.out.println(str);
    }

    private static void consumerString(Consumer<String> stringConsumer, String str) {
    
    
        stringConsumer.accept(str);
    }
}

コンソール出力:

チェンフェイリン
チェンフェイリン

String str オブジェクトの値は変更されていません。

5.述語インターフェース

  • 説明する

述語: アサーション
私はこれをジャッジ インターフェイスと呼び、その機能メソッドは **boolean test(Object)** です。
パラメータ値を渡して判定結果を返します。
ここに画像の説明を挿入します


  • コード:ブール値テスト(オブジェクト)
public class Predicate_Practice {
    
    

    public static void main(String[] args) {
    
    

        String str = "chenfeilin";
        checkString((String s) -> {
    
    
            return s.length() > 3;
        }, str);

    }

    private static void checkString(Predicate<String> stringPredicate, String str) {
    
    
        boolean test = stringPredicate.test(str);
        if (test) {
    
    
            System.out.println("OK");
        } else {
    
    
            System.out.println("NG");
        }
    }

}

输出结果为:OK

  • 補足:アサーションとして、その判定条件は&& || などの組み合わせ形式にする必要があります。ここに画像の説明を挿入します

  • コード:

public class Predicate_Practice {
    
    

    public static void main(String[] args) {
    
    

        String str = "chenfeilin";
        moreCheck((String s1) -> {
    
    
            return s1.length() > 5;
        }, (String s2) -> {
    
    
            return s2.startsWith("ccc");
        }, str);

    }

    private static void moreCheck(Predicate<String> stringPredicate1,
                                  Predicate<String> stringPredicate2, String str) {
    
    

        boolean test1 = stringPredicate1.and(stringPredicate2).test(str);
        boolean test2 = stringPredicate1.or(stringPredicate2).test(str);
        boolean test3 = stringPredicate1.negate().test(str);

        System.out.println(test1);
        System.out.println(test2);
        System.out.println(test3);
    }

}

输出结果:
false
true
false

6.機能インターフェース

  • 説明する

関数: 関数
これをプロセッサ インターフェイスと呼び、その関数メソッドは **apply(Object) ** です。
パラメータを渡して(T 型)、値を返します(R 型)。
ここに画像の説明を挿入します

  • コード: apply(オブジェクト)
public class Function_Practice {
    
    

    public static void main(String[] args) {
    
    

        int count = 33;
        function((Integer a) -> {
    
    
            return String.valueOf(a + 100);
        }, count);

    }

    private static void function(Function<Integer, String> integerStringFunction, int a) {
    
    
        String result = integerStringFunction.apply(a);
        System.out.println(result);
    }

}

输出结果为:133
  • コード補足: andThen (Function<? super R,? extends V> after)
    たとえば、Function1 の入力タイプは A、出力タイプは B、そして別の Function2 の入力パラメータ タイプは正確に B である場合、次のようになります。リンクを形成し、Function1の戻り値をFunction2の入力値として使用し、複数の「処理」を実行します
public class Function_Practice {
    
    

    public static void main(String[] args) {
    
    

        int count = 33;
        moreFunction((Integer a) -> {
    
    
            return String.valueOf(a + 100);
        }, (String str) -> {
    
    
            return str.length() > 2;
        }, count);

    }

    private static void moreFunction(Function<Integer, String> function1,
                                     Function<String, Boolean> function2, int a) {
    
    
        Boolean aBoolean = function1.andThen(function2).apply(a);
        System.out.println(aBoolean);
    }

}

おすすめ

転載: blog.csdn.net/cjl836735455/article/details/108696996