什麼是函數式接口?
就是java類型系統的接口,只包含一個接口的特殊接口,語義化檢測的註解:@FunctionalInterface。
java1.8的新增的static方法和default方法不影響函數式接口的聲明,需要注意的是,java的所有的對象都繼承自object,也就是意味着函數式接口中重寫tostring方法也不影響函數式接口的聲明。
與lambda表達式的關係:
函數式接口只能包含一個操作方法,lambda表達式只能操作一個方法,lambda的核心就是一個函數式接口的實現。
java系統中內置常見的幾種函數式接口:
java1.8中的 java.util.function 包提供了大量的函數式接口:如下: Predicate 接收參數T對象,返回一個boolean類型結果 Consumer 接收參數T對象,沒有返回值 Function 接收參數T對象,返回R對象 Supplier 不接受任何參數,直接通過get()獲取指定類型的對象 UnaryOperator 接口參數T對象,執行業務處理後,返回更新後的T對象
以上幾個函數式接口其中最後兩個最常用。
代碼舉例:
//java1.8系統內置的函數式接口,查看源碼可以看出來具體的方法
//此函數接收一個參數,返回一個布爾類型的值
Predicate<String> per = (String name) -> {
return "admin".equals(name)?true:false;
};
System.out.println(per.test("admin"));
// 輸出:true
//java1.8系統內置的函數式接口,
//此函數接收一個參數,沒有返回值
Consumer<String> con = (String name) -> {
System.out.println("此方法沒有返回值!!!");
};
con.accept("此方法沒有返回值!!!!!");
//系統輸出:此方法沒有返回值!!!!!
//java1.8系統內置的函數式接口,
//此函數接收兩個對象(T,R),接收一個T對象的參數,返回一個R對象
Function<String,Integer> fun = (String gender) -> {
return "men".equals(gender) ? 1:0;
};
System.out.println(fun.apply("men"));
//輸出 1
//java 1.8系統內置的函數式接口。
//此函數是不接收參數,並有返回值
Supplier<String> sup = () -> {
return UUID.randomUUID().toString();
};
System.out.println(sup.get());
//輸出 系統生成的UUID(String類型)
//java1.8系統內置的函數式接口
//此函數是接收一個什麼的對象,返回一個什麼類型的對象
UnaryOperator<String> up = (String img)->{
img += "【1024*24】";
return img;
};
System.out.println(up.apply("原圖~~"));
//輸出:原圖~~【1024*24】
//java1.8系統內置的函數式接口,
//此函數接收兩個對象,返回一個對象
BinaryOperator<Integer> bp = (Integer i1,Integer i2) ->{
return i1 + i2;
};
System.out.println(bp.apply(1,2));
//輸出: 3