大話lambda表達式
LAMBDA表達式
Lambda是一個表達式,也可以說它是一個匿名函數。
然而在使用它或是閱讀Lambda代碼的時候,卻顯得并不那麼容易。
因為它匿名,因為它删減了一些必要的說明資訊(比如方法名)。
我的了解裡,lambda表達式就是一塊代碼段。這段代碼段不需要定義一個名稱,是以稱之為匿名表達式。
基礎用法
package com.taobao.java8;
/**
- Created by jianghuiwen on 2018/6/7.
-
函數式接口
*/
@FunctionalInterface
public interface IShow {
void dosome();
}
先定義一個函數式接口,即隻有一個方法的接口。上述的定義的接口的實作,就可以用一個lambda表達式來實作。
lambda表達式是對接口的一種簡單實作
@Test
public void test1(){
/**
* 匿名内部類的寫法,即在使用的地方,定義接口的實作
*/
IShow ishow = new IShow() {
@Override
public void dosome() {
System.out.println("hi");
}
};
ishow.dosome();
}
上述是接口的一種複雜實作方式,可以看到不管多簡單的一個接口,都要new一個完整的實作方式。而采用lambda表達式,則可以用非常簡單的代碼塊來實作。
public void test1(){
/**
* lambda表達式方式實作
*/
IShow ishow = ()-> System.out.println("hi");
ishow.dosome();
}
可以看到,令碼農們驚歎的地方來了,居然能如此簡單,如此讓人癡迷,可以這麼高效精簡的寫出代碼塊來。
當然,不僅僅停止于此,還有更為精簡的一些寫法。
在很多業務場景,我們想使用一段代碼塊來實作某個功能,例如前置校驗,我們會先定義一個接口,然後定義一個實作體,然後在實作體裡實作具體的業務邏輯。
但是,我們關注這個接口的定義嘛?其實我們不關注,我們隻關注實作體裡的如何完成業務邏輯即可,是以定義一個接口并完成實作這個操作實在是太多餘了,是以有了一下的優化方案。
如上所示,我們要先定義一個接口,然後把匿名表達式指派給一個接口,最後調用這個接口。每次都定義一個接口很麻煩,java8裡提供了幾個預設的接口。比如,consumer。該接口接收一個參數,傳回空值。
public void test1(){
/**
* lambda表達式方式實作
*/
Consumer ishow = (a)-> System.out.println("hi "+a);
ishow.accept("jianghuiwen");
}
這樣,我們就不用自己定義一個IShow接口了!非常牛逼了。 但是,每次還是有一個麻煩,即,我還是要把lambda表達式指派給Consumer ishow。是以,在Java自定義的一些方法裡,預設直接接收這種類型的表達式,省去了重新定義一下。下面看一個篩選清單值裡大于50的值的方法。
public void test1(){
List<Integer> list = Arrays.asList(23,45,56,676,32,323,43,43);
//list的forEach方法接收一個lambda表達式
list.forEach(item->{
if(item>50){
System.out.println(item);
}
});
}
從這裡可以學習到幾個非常重要的點,第一個就是lambda表達式可以用來對接口進行實作,降低每次實作一個接口的編碼成本。第二個就是可以采用系統内置的幾個接口完成更簡單的業務邏輯實作。最後就是在自己定義類時,可以預置一些函數式接口用于提高編碼效率。