java是一門面向對象的語言,面向對象的語言使用帶有方法的對象封裝行為,而函數式編程使用函數封裝行為,Java的對象一般比較重量級。當實例化一個對象時往往涉及到初始化他用到的其他字段和方法以及類。為了對那些只在調用處使用一次的方法提供一種輕量級的封裝,Java的Lambda出生了。在沒有Lambda表達式的時候我們一般使用匿名內部類來處理這種需求,但是匿名內部類有以下不足 1. 語法不簡潔 2. 匿名內部類的this和變量名容易讓人產生誤解 3. 類載入和實例創建語句不夠靈活 4. 無法獲取非final的局部變量 5. 無法對控制流進行抽象
我們把只有一個方法的接口叫做函數式接口。函數式接口不需要加任何額外的東西,編譯器會自動判斷(判斷過程并非簡單的對接口方法計數:一個接口可能冗余的定義了一個Object已經提供的方法,比如toString(),或者定義了靜態方法或默認方法,這些都不屬于函數式接口方法的范疇)。也可以通過@FunctionalInterface注解來顯式指定一個接口是函數式接口。我們現在的類庫有很多是函數式接口的,就可以直接使用lamdba表達式。 - Java8增加了一個新包,java.util.function,它里面包含了常用的函數式接口 1. PRedicate——接收T對象并返回boolean 2. Consumer——接收T對象,不返回值 3. Supplier——提供T對象(例如工廠),不接收值 4. UnaryOperator——接收T對象,返回T對象 5. BinaryOperator——接收兩個T對象,返回T對象
public static void hasDoneLambda(){ // Function<T, R> -T作為輸入,返回的R作為輸出 Function<String,String> function=(x)->{ return "function"+x; }; System.out.println(function.apply("舒莉")); //Predicate<T> -T作為輸入,返回的boolean值作為輸出 Predicate<String> predicate=(s)->{ System.out.println(s); return false; }; predicate.test("hello world"); //Consumer<T> - T作為輸入,執行某種動作但沒有返回值 Consumer<String> consumer=(s)->{ System.out.println(s); }; consumer.accept("shuli"); //Supplier<T> - 沒有任何輸入,返回T Supplier<String> supp = () -> {return "Supplier";}; System.out.println(supp.get()); //BinaryOperator<T> -兩個T作為輸入,返回一個T作為輸出,對于“reduce”操作很有用 BinaryOperator<String> bina = (x,y) ->{System.out.print(x+" "+y);return "BinaryOperator";}; System.out.println(" "+bina.apply("hello ","world")); }注:
泛型類型是必須指定的,編譯器根據他們推斷出方法的傳入參數類型和返回值類型。函數塊類可以調用類的成員變量和局部變量,編譯器會自動把類的成員變量和局部變量轉成final類型的,如果類的成員變量和局部變量值發生了變化,編譯器無法推斷他是final類型的調用就會出錯。Lambda表達式主要由4部分組成 1. 函數式接口 2. 參數列表 3. 符號-> 4. 函數體。
引用:http://www.cnblogs.com/figure9/archive/2014/10/24/4048421.html
新聞熱點
疑難解答