java8 -函數式編程之四個基本接口

    無論lambda表達式仍是Stream流式編程,Function、Consumer、Supplier、Predicate 四個接口是一切函數式編程的基礎。下面咱們詳細學習這四個巨頭,java

interface Supplier<T>

    該接口的中文直譯是「提供者」,能夠理解爲定義一個lambda表達式,沒有輸入參數,返回一個T類型的值。編程

Supplier<Integer> supplier = () -> 10;
//輸出10
System.out.println(supplier.get());

interface Consumer<T>

    該接口的中文直譯是「消費」,能夠理解爲定義一個lambda表達式,接收一個T類型的參數,而且沒有返回值。app

  • accept :接收參數,並調用Consumer接口裏的方法
Consumer<Integer> print = x -> System.out.println(x);
//輸出10
print.accept(10);

 

  • andThen:調用完consumer本身後,還調用andThen方法參數中指定的Consumer
Consumer<Integer> print = x -> System.out.println(x);
Consumer<Integer> printPlusSelf = x -> System.out.println(x + x);

//輸出10以及20
print.andThen(printPlusSelf).accept(10);

interface Function<T, R>

        該接口的中文直譯是「函數」,能夠理解爲:定義一個lambda表達式接收一個T類型的參數,返回一個R類型的值。函數式編程

  • apply:傳入一個T類型的參數,返回一個R類型的值函數

Function<Integer, Integer> plusSelf = x -> x + x;

//apply
System.out.println(plusSelf.apply(10));

 

  • compose:accept獲取到的參數,先執行compose裏面的Function,再執行原Function學習

//兩個function
        Function<Integer, Integer> plusSelf = x -> {
            System.out.println("plusSelf");
            return x + x;
        };
        Function<Integer, String> toString = x -> {
            System.out.println("toString");
            return String.valueOf(x);
        };

        //輸出20,整數10先自加變成20,而後由toString轉換成字符串
        String string1 = toString.compose(plusSelf).apply(10);
        System.out.println(string1);

 

  • andThen:與compose相反。先執行原Function,在執行andThen裏面的Function。測試

//兩個function
        Function<Integer, Integer> plusSelf = x -> {
            System.out.println("plusSelf");
            return x + x;
        };
        Function<Integer, String> toString = x -> {
            System.out.println("toString");
            return String.valueOf(x);
        };

        //輸出20, 先自加,再轉換成字符串
        String string2 = plusSelf.andThen(toString).apply(10);
        System.out.println(string2);

 

interface Predicate<T>

    該接口的中文直譯是「斷言」,用於返回false/true。T是lambda表達式的輸入參數類型。spa

  • test :測試test方法中輸入參數是否知足接口中定義的lambda表達式.net

Predicate<String> test = x -> "test".equals(x);
        Predicate<String> test2 = x -> "test2".equals(x);

        //test
        System.out.println(test.test("test")); //true
        System.out.println(test.test("test_false")); //false

 

  • and :原 Predicate 接口和 and 方法中指定的 Predicate 接口要同時爲true,test方法才爲true。與邏輯運算符 && 一致。code

Predicate<String> test = x -> "test".equals(x);
        Predicate<String> test2 = x -> "test2".equals(x);

        //and
        System.out.println(test.and(test2).test("test")); //false

 

  • negate:對結果取反後再輸出

Predicate<String> test = x -> "test".equals(x);
        Predicate<String> test2 = x -> "test2".equals(x);

        //negate
        System.out.println(test.negate().test("test")); //false

 

  • or:原 Predicate 接口和 or 方法中指定的 Predicate 接口只要一個爲true,test方法爲true。與邏輯運算符 || 一致。
Predicate<String> test = x -> "test".equals(x);
        Predicate<String> test2 = x -> "test2".equals(x);
        //or
        System.out.println(test.or(test2).test("test")); //false

 

相關資料

Java 8 函數式編程系列

    java8 -函數式編程之Lambda表達式

    java8 -函數式編程之四個基本接口

    java8 -函數式編程之Optional

    java8 -函數式編程之Stream

相關文章
相關標籤/搜索