Java 8之Lambda

公司內部的一些新項目相繼採用了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的同學用起來。

發佈了76 篇原創文章 · 獲贊 535 · 訪問量 95萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章