Java中的lambda匿名函數使用


Java中的lambda匿名函數使用

lambda匿名函數的使用是為了滿足某些情況下需要臨時定義函數,或者事先定義,需要時才使用。在python里面,lambda表達式的表達方式為:lambda 參數: 表達式,例如,需要對一個列表的每項元素進行加1操作,我們就可以這樣:list(map(lambda x: x+1, range(10)),上述表達式中:list(iterables)是將括號里的參數轉換成列表樣式,參數要求是可迭代對象;map(func, iterables)則是將iterables可迭代對象中的每個元素都調用函數func;lambda x: x+1則是一個匿名函數,參數為x,對x進行加1操作;range(10)則是生成一個[0,1,2,3,4,5,6,7,8,9]的列表,也就是Java中的數組。

一下是python中的map函數的源碼解釋

回到我們的Java,Java中的lambda表達式則有一點不一樣,語法為(參數1,參數2) -> statements/block,當不需要參數時,就可以直接寫為() -> statement/block,比如說() -> System.out.println("I use lambda")。其實現當時需要一個函數接口,函數接口形如public static void func(Interface action) { statements;},關於函數接口,就是定義一個函數,參數為一個接口類型,里面的語句就是調用接口中定義的方法。因為接口只是定義了,並沒有實現方法,所以說當我們將一個形如lambda函數的函數引用傳入時,該函數就會直接實現傳入的函數。比如說:

public interface interfaceTest { //定義一個函數接口
    void test();
}
public class test {
    public static void main(String[] args) {
          tt(()-> System.out.println("調用lambda"));
    }
    public static void tt(interfaceTest action){ 
        action.test(); //調用函數接口中未實現的方法
    }
}

另外一個帶參數的例子:

public interface interfaceTest { //定義一個函數接口
    void test(int value); //
}
public class test {
    public static void main(String[] args) {
          tt(10;(i)-> System.out.println(i+1)); // lambda語句的意思為給參數實行+1操作
    }
    public static void tt(int n,interfaceTest action){ 
        for (int i=0;i<n;i++) {
            action.test(i);
        }
    }
}

函數引用。lambda表達式實則上一個函數引用,除此之外還有另一個例子:

public interface interfaceTest { //定義一個函數接口
    void test();
}
public class test {
    public static void main(String[] args) {
        repeat(10, test::test));
    }
      public static void test() {
        System.out.println("hello");
    }
    public static void repeat(int n, interfaceTest action)
    {
        for (int i = 0; i < n; i++) action.test();
    }
}

這里函數引用主要有三種情況:

  • object::instanceMethod
  • Class::staticMethod
  • Class::instanceMethod

就拿第一種來說,就描述的是object中的instanceMethod方法,其中instanceMethod的參數類型需要與定義的函數接口一致,若函數引用中的函數有參數,則函數接口也應該有相應的參數。比如說:

public interface interfaceTest { //定義一個函數接口
    void test(int value); 
}
public class test {
    public static void main(String[] args) {
        repeat(10,test::testTwo);

    }
    public static void repeat(int n, interfaceTest action)
    {
        for (int i = 0; i < n; i++) action.testTwo(i);
    }

    public static void testTwo(int n) {
        System.out.println("test:"+n);
    }
}

可能有人會說lambda函數跟這個有什么關系,我們看看下面這個:

就可以知道,其實函數引用也是屬於lambda的一部分。

最后,讀者整理一些關於Java高並發的資料,歡迎大家閱覽:
關於Java高並發你需要知道的“升段位攻略”


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM