公司內部的一些新項目相繼採用了Java 8,這纔有了動力好好的研究一下Java 8這個傳說中的大殺器。Java 8文檔裏面提到的第一個改進就是Lambda,就從它入手好了。社區好多大神都已經研究幾年了,拜一下。有不準確的地方,望指正。
爲什麼要Lambda
把Java代碼寫得更簡潔一點,更直白來說,就是寫出來的代碼篇幅更短。那麼簡單?核心來說,是的,不過可能額外帶來一些好處。理論上來說,Lambda不是必需品,有了寫的代碼更優雅簡練。Java最被詬病的問題之一就是代碼量大(很多是無用的,只是語法要求這麼幹而已),Lambda能夠給Java代碼瘦瘦身。Java社區對Lambda的呼聲一直很高,終於Java 8來了,項目中也陸續用起來。撒花…
Lambda到底是什麼
Java中,Lambda是匿名方法,目的是簡化函數接口(Functional Interface)的編寫。
- 什麼是函數接口?
函數接口是一種特殊的接口,是隻有一個抽象方法的接口 - 什麼是抽象方法?
抽象方法是沒有實現的方法,也就是方法參數後面沒有跟大括號
所以,Java中任何Lambda必定有對應的函數接口,函數接口是Lambda的類型,Lambda是函數接口的實例。函數接口需要提前聲明好,Lambda在使用的時候再寫。好煩啊,用Lambda還得先寫函數接口?是的,不過JDK設計的時候考慮到這一點,預先給大家提供了好幾個常用的函數接口,都在java.util.function包下,比如Predicate,Consumer等。
Lambda語法
Lambda由三部分組成,參數,->,方法體
參數
(ParamType1 p1, ParamType2 p2, …)
參數類型可省,變爲(p1, p2, …)
只有一個參數時括號也可省,p1方法體
一個表達式或者一個語句塊,return語句不必寫
表達式會有一個計算結果
語句塊用大括號括起來(可以寫多條語句),只有一條語句並且函數接口的抽象方法的返回值爲void時,大括號可省
Lambda例子
public class Lambda {
public static void main(String[] args) {
List<Material> materials = new ArrayList<Material>();
materials.add(new Material());
materials.add(new Material());
materials.add(new Material());
materials.add(new Material());
materials.add(new Material());
doSomthing(materials,
(Material m) -> System.out.println("Print " + m.getId()));
}
public static void doSomthing(List<Material> materials,
FunctionalInterfaceDemo demo) {
for (Material material : materials) {
demo.print(material);
}
}
static class Material {
public static int idStore = 1;
private int id;
public Material() {
id = idStore++;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
static interface FunctionalInterfaceDemo {
void print(Material material);
}
}
FunctionalInterfaceDemo就是函數接口。
結語
參數類型可以不寫,剛開始時不習慣。不過JDK會在編譯時推測Lambda對應的函數接口,從而知道抽象方法信息。另外注意Lambda不會生成一個新的scope(雖然有大括號),和Lambda所在的scope相同。Lambda雖然不是必需品,但也絕對不是奢侈品,其它語言都用好多年了,升到Java 8的同學用起來。