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高並發你需要知道的“升段位攻略”
