java8
它可讓咱們用簡潔流暢的代碼完成一個功能。java
很長一段時間java被吐槽是冗餘和缺少函數式編程能力的語言,隨着函數式編程的流行java8種也引入了 這種編程風格。程序員
在此以前咱們都在寫匿名內部類幹這些事,但有時候這不是好的作法,本文中將介紹和使用lambda, 帶你體驗函數式編程的魔力express
lambda
表達式是一段能夠傳遞的代碼,它的核心思想是將面向對象中的傳遞數據變成傳遞行爲。編程
咱們回顧一下在使用java8
以前要作的事,以前咱們編寫一個線程時是這樣的:ide
Runnable r = new Runnable() { @Override public void run() { System.out.println("do something."); } }
也有人會寫一個類去實現Runnable
接口,這樣作沒有問題,咱們注意這個接口中只有一個run
方法, 當把Runnable
對象給Thread
對象做爲構造參數時建立一個線程,運行後將輸出do something.。
咱們使用匿名內部類的方式實現了該方法函數式編程
這其實是一個代碼即數據的例子,在run
方法中是線程要執行的一個任務,但上面的代碼中任務內容已經被規定死了。 當咱們有多個不一樣的任務時,須要重複編寫如上代碼函數
設計匿名內部類的目的,就是爲了方便 Java
程序員將代碼做爲數據傳遞。不過,匿名內部 類仍是不夠簡便。 爲了執行一個簡單的任務邏輯,不得不加上 6 行冗繁的樣板代碼。那若是是lambda
該怎麼作?學習
Runnable r = () -> System.out.println("do something.");
嗯,這代碼看起來很酷,你能夠看到咱們用()和->的方式完成了這件事,這是一個沒有名字的函數,也沒有人和參數,再簡單不過了。 使用->將參數和實現邏輯分離,當運行這個線程的時候執行的是->以後的代碼片斷,且編譯器幫助咱們作了類型推導; 這個代碼片斷能夠是用{}包含的一段邏輯。下面一塊兒來學習一下lambda
的語法。線程
expression = (variable) -> action
variable
: 這裏是一個變量,一個佔位符,像x
,y
,z
,能夠是多個變量,也就是說左側是lambda
表達式的參數列表action
: 這裏我稱它爲action
(也就是表達式中所需執行的功能), 這是咱們實現的代碼邏輯部分,它能夠是一行代碼也能夠是一個代碼片斷Java
中lambda
表達式的格式:參數、箭頭、以及動做實現,當一個動做實現沒法用一行代碼完成,能夠編寫 一段代碼用{}包裹起來lambda
表達式能夠包含多個參數int sum = (x, y) -> x + y;
這時候咱們應該思考這段代碼不是以前的x
和y
數字相加,而是建立了一個函數,用來計算兩個操做數的和。 後面用int
類型進行接收,在lambda
中爲咱們省略去了return
設計
Runnable runnable1 = () -> System.out.println("lambda表達式");
// Consumer 接口能夠查看源碼 Consumer<String> consumer = (x)-> System.out.println(x); consumer.accept("有參數的lambda表達式");
Consumer<String> consumer = x-> System.out.println(x); consumer.accept("有參數的lambda表達式");
Comparator<Integer> comparator1 = (x, y) -> { System.out.println(x + y); return Integer.compare(x,y); };
Comparator<Integer> comparator1 = (x, y) -> Integer.compare(x, y);
Comparator<Integer> comparator1 = (x, y) -> Integer.compare(x, y);
以下的代碼咱們仔細閱讀
@FunctionalInterface public interface MyFunction<T> { public Integer getValue(Integer num); }
上面的代碼,咱們定義了一個函數型的接口,該接口存在一個抽象方法,該方法的具體實現由咱們本身實現
public class TestLambda02 { public static void main(String[] args) { Integer value = operation(100, x -> x * 2); System.out.println(value); } public static Integer operation(Integer num, MyFunction mf) { return mf.getValue(num); } }
上面代碼中,對於函數型接口MyFunction
,咱們採用了自定義實現x->x*2
,由此能夠發現lambda表達式就是一段能夠傳遞的代碼