JAVAスタディノート12-機能インターフェイス

機能的なインターフェース

1.基本概念
1つだけの抽象メソッドを持つ
インターフェース関数型インターフェース、つまり関数型プログラミングシナリオに適したインターフェースJavaの関数はプログラミングの実施形態としてのLambdaであるため、関数型インターフェースはLambdaに適用できるインターフェースです。JavaのLambdaは、インターフェースに抽象メソッドが1つしかない場合にのみ、スムーズに派生できます。
構文形式:
修飾子インターフェースインターフェース名{ パブリック抽象戻り値タイプメソッド名(オプションのパラメーター情報); } @FunctionalInterfaceアノテーション関数:はいかどうかを確認しますインターフェイスは機能インターフェイス2です。機能インターフェイスの使用は、通常、メソッドパラメータおよび戻り値として使用できます。





public class Demo01 {
    
    
    //定义一个方法,参数适用函数是接口MyFunctionalInterface
    public static void show(MyFuncitionalInterface myInter){
    
    
        myInter.method();
    }

    public static void main(String[] args) {
    
    
        //调用show方法,方法的参数是一个接口,所以可以传递接口的实现类对象
        show(new MyFunctionalInterfaceImpl());
        //调用show方法,方法的参数是一个接口,所以我们可以传递接口的匿名内部类
        show(new MyFuncitionalInterface() {
    
    
            @Override
            public void method() {
    
    
                System.out.println("使用匿名内部类");
            }
        });
        //调用show方法,方法的参数是一个函数式接口,可以使用Lambda表达式
        show(()->{
    
    
            System.out.println("使用Lambda重写接口中的抽象方法");
        });
    }
}

3.関数型プログラミング

public class Demo02 {
    
    
    public static void showLog(int level,MessageBuilder mb){
    
    
        if(level==1){
    
    
            System.out.println(mb.builderMessage());
        }
    }

    public static void main(String[] args) {
    
    
        String msg1="hello";
        String msg2="world";
        String msg3="Java";
        showLog(1,()->{
    
    
            return msg1+msg2+msg3;
        });
        showLog(2,()->{
    
    
            return msg1+msg2+msg3;
        });
    }
}

Lambda式をパラメーターとして使用するのは、パラメーターをshowLogメソッドに渡すためだけです。
条件が満たされた場合にのみ、MessageBuilderメソッドのbuilderMessageメソッドが呼び出されます。条件が満たされない場合は、MessageBuilderメソッドのbuilderMessageメソッドが呼び出されます。実行されず、パフォーマンスもありません。パラメーターとしてのLambdaの無駄な
使用

public class Demo03 {
    
    
    public static void startThread(Runnable run){
    
    
        new Thread(run).start();
    }

    public static void main(String[] args) {
    
    
        startThread(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                System.out.println(Thread.currentThread().getName());
            }
        });
        //Lambda表达式
        startThread(()->{
    
    
            System.out.println(Thread.currentThread().getName());
        });
    }
}

戻り値としてLambdaを使用します

public class Demo04 {
    
    
    public static Comparator<String> getComparator(){
    
    
        return(String o1,String o2)->{
    
    
            return o2.length()-o1.length();
        };
    }

    public static void main(String[] args) {
    
    
        String[] arr={
    
    "Kobe","James","Curry","Jordan"};
        Arrays.sort(arr,getComparator());
        System.out.println(Arrays.toString(arr));
    }
}

4.一般的に使用される関数型インターフェース
サプライヤーインターフェース
Tget():指定されたタイプの汎用パラメーターのオブジェクトデータを取得するために使用されます

public class Demo05 {
    
    
    //定义一个方法,方法的参数传递Supplier<T>接口,泛型执行String.get方法返回一个String
    public static String getString(Supplier<String> sup){
    
    
        return sup.get();
    }

    public static void main(String[] args) {
    
    
        //调用getString方法,方法的参数Supplier是一个函数式接口,所以可以传递Lambda表达式
        String s=getString(()->{
    
    
            return "hello,world";
        });
        System.out.println(s);
    }
}

コンシューマーインターフェイス
抽象メソッド:void accept(T t)、これは指定された汎用データを消費することを意味します

public class Demo06 {
    
    
    public static void method(String s, Consumer<String> con){
    
    
        con.accept(s);
    }

    public static void main(String[] args) {
    
    
        //调用method方法,传递字符串,方法的另一个参数是Consumer接口,是一个函数式接口,可以使用Lambda表达式
        method("Kobe",(String s)->{
    
    
            System.out.println(s);
        });
    }
}

デフォルトのメソッド:andThenメソッドのパラメーターと戻り値がすべてConsumerタイプの場合、効果を実現できます。データを消費するときは、最初に操作を実行し、次に操作を実行して組み合わせを実現します。

public class Demo06 {
    
    
    //定义一个方法,方法的参数传递一个字符串和两个Consumer接口,Consumer接口的泛型使用字符串
    public static void method(String s,Consumer<String> con1,Consumer<String> con2){
    
    
/*        con1.accept(s);
        con2.accept(s);不使用andThen*/
        con1.andThen(con2).accept(s);
    }

    public static void main(String[] args) {
    
    
        method("hello",(t)->{
    
    
            System.out.println(t.toUpperCase());
        },(t)->{
    
    
            t.toLowerCase();
        });
    }  
}

述語インターフェース
特定のタイプのデータを判断する
抽象メソッド:boolean test(T t)

public class Demo06 {
    
    
    public static boolean method(int num, Predicate<Integer> pre){
    
    
        return pre.test(num);
    }

    public static void main(String[] args) {
    
    
        int num=20;
        boolean res = method(num, (Integer n) -> {
    
    
            return n>10;
        });
        System.out.println(res);
    }
}

デフォルトのメソッドand、or、negate

public class Demo06 {
    
    
    /*
    判断字符串长度是否大于5,字符串中是否包含a
     */
    public static boolean method(String s,Predicate<String> pre1,Predicate<String> pre2){
    
    
        return pre1.and(pre2).test(s);
        //return pre1.or(pre2).test(s);
    }

    public static void main(String[] args) {
    
    
        String s="HelloWorld";
        boolean res = method(s, (String str) -> {
    
    
            return str.length() > 5;
        }, (String str) -> {
    
    
            return str.contains("a");
        });
        System.out.println(res);
    }
}

運動

public class Demo07 {
    
    
    public static ArrayList<String> method(String[] arr, Predicate<String> pre1,Predicate<String> pre2){
    
    
        ArrayList<String> list=new ArrayList<>();
        for (String s : arr) {
    
    
            boolean b = pre1.and(pre2).test(s);
            if(b){
    
    
                list.add(s);
            }
        }
        return list;
    }

    public static void main(String[] args) {
    
    
        String[] arr={
    
    "Kobe,24","James,23","Jordan,23","Curry,30"};
        ArrayList<String> list = method(arr, (String s) -> {
    
    
            return s.split(",")[1].equals("23");
        }, (String s) -> {
    
    
            return s.split(",")[0].length() > 5;
        });
        System.out.println(list);
    }
}

関数インターフェイス
インターフェイスは、あるタイプのデータを別のタイプに従って取得するために使用されます。
抽象メソッド:R apply(T t)、Tのパラメーターに従ってタイプRの結果を取得します。

public class Demo08 {
    
    
    public static void method(String s, Function<String,Integer> fun){
    
    
        Integer in=fun.apply(s);
        System.out.println(in);
    }

    public static void main(String[] args) {
    
    
        String s="12345";
        method(s,(String str)->{
    
    
            return Integer.parseInt(str);
        });
    }
}

おすすめ

転載: blog.csdn.net/qq_44708714/article/details/107161595