無論lambda表達式仍是Stream流式編程,Function、Consumer、Supplier、Predicate 四個接口是一切函數式編程的基礎。下面咱們詳細學習這四個巨頭,java
該接口的中文直譯是「提供者」,能夠理解爲定義一個lambda表達式,沒有輸入參數,返回一個T類型的值。編程
Supplier<Integer> supplier = () -> 10; //輸出10 System.out.println(supplier.get());
該接口的中文直譯是「消費」,能夠理解爲定義一個lambda表達式,接收一個T類型的參數,而且沒有返回值。app
Consumer<Integer> print = x -> System.out.println(x); //輸出10 print.accept(10);
Consumer<Integer> print = x -> System.out.println(x); Consumer<Integer> printPlusSelf = x -> System.out.println(x + x); //輸出10以及20 print.andThen(printPlusSelf).accept(10);
該接口的中文直譯是「函數」,能夠理解爲:定義一個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);
該接口的中文直譯是「斷言」,用於返回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
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 函數式編程系列