JAva 8のLambda式2:内蔵関数インタフェース

5993 ワード

jdk 1から.8はユーザーの開発を容易にするために新しいパッケージを提供し始めた:java.util.functionは,このパッケージの中でユーザが行う可能性のある関数式インタフェースについて共通定義を行った.javaでutil.functionパッケージで最もコアなインタフェースは4つあります.
  • 機能型インタフェース:Function
  • 消費型インタフェース:Consumer
  • 供給型インタフェース:Supplier
  • 断言形インタフェース:Predicate
  • 1.機能型インタフェース
    @FunctionalInterface
    public interface Function<T, R> {
        R apply(T t);//            
    }

    例:String型データを受信し、int型データを返す機能型インタフェースを実装するIntegerクラスを参照するparseInt()メソッド.
    public class TestDemo {
        public static void main(String[] args) {
            Function<String,Integer> fn=Integer::parseInt;
            int num=fn.apply("100");
            System.out.println(num*2);
        }
    }

    つまり,データを入力し,結果を返す方法はFunctionインタフェースで定義できる.
    2.消費型インタフェース:Consumer
    まずConsumerインタフェースの定義を観察します.
    @FunctionalInterface
    public interface Consumer<T>{
        public void accept(T t);//     ,      
    }

    例:消費型インタフェースを用いてSystemを参照する.out.println()メソッド
    public class TestDemo {
        public static void main(String[] args) {
            Consumer<String> con =System.out :: println;
            con.accept("Hello Lambda");
        }
    }

    3.供給型:Supplier
    インタフェースの定義:
    @FunctionalInterface
    public interface Supplier<T> {
        T get();
    }
    

    このインタフェースのメソッドにはパラメータはありませんが、データを返すことができます.例:供給型メソッドリファレンス、Systemを設定.currentTimeMillis
    public class TestDemo {
        public static void main(String[] args) {
            Supplier<Long> sup=System::currentTimeMillis;
            System.out.println(sup.get());
        }
    }

    4.アサーション型インタフェース:Predicate
    まず、インタフェース定義を確認します.
    @FunctionalInterface
    public interface Predicate<T> {
        boolean test(T t);
    }

    例:Stringクラスのmatchesメソッドを参照
    public class TestDemo {
        public static void main(String[] args) {
            String str="100";
            Predicate<String> pre=str::matches;
            System.out.println(pre.test("\\d+"));
        }
    }

    以上の4つはコアインタフェースであり、他のインタフェースはそれに似ています.BiFunctionの場合、このインタフェースは次のように定義されます.
    @FunctionalInterface
    public interface BiFunction<T, U, R> {
        R apply(T t, U u);
    }

    Functionインタフェースとは異なりますが、ここでは2つのパラメータを設定できます.例:BiFunctionインタフェースを使用してStringクラスを参照するreplaceAll()メソッド
    public class TestDemo {
        public static void main(String[] args) {
            String str="hello";
            BiFunction<String,String,String> bf =str::replaceAll;
            System.out.println(bf.apply("l", "-"));//  he--o
        }
    }

    関数式のインタフェースを提供すると、システムクラスライブラリにも大量に表示されます.CollectionインタフェースにforEach()メソッド、default void forEach(Consumer)を新たに定義しました
    public class TestDemo {
        public static void main(String[] args) {
            List<String> pro=new ArrayList<String>();
            pro.add("java");
            pro.add("android");
            pro.add("ios");
            pro.add("python");
            pro.add("node.js");
            pro.add("html");
            pro.forEach((s)->System.out.println(s));
            pro.forEach(s->System.out.println(s));//        ,       ,   ()
        }
    }

    内蔵の関数式インタフェースが提供するため、開発基準を同意させ、後日ユーザーは自分で関数式インタフェースを開発する必要がなくなり、javaを直接使用する.util.functionパッケージのインタフェースでいいです.