Lambda表達式使用教程
一套才、Lambda表達式的本質
Lambda表達式的本質就是函數式接口的實例吞滞,即一個接口只聲明了一個抽象方法漠趁,則此接口就稱為函數式接口扁凛。
二、特點
- 只包含一個抽象方法的接口闯传,稱為函數式接口谨朝。
- 你可以通過Lambda表達式來創(chuàng)建該接口的對象。( 若Lambda表達式拋出一個受檢異常(即:非運行時異常)甥绿,那么該異常需要在目標接口的抽象方法上進行聲明)字币。
- 我們可以在一個接口上使用@Functionallnterface注解,這樣做可以檢查它是否是一個函數式接口共缕。同時javadoc也會包含一條聲明洗出, 說明這個接口是一個函數式接口。
- 在java.util.function包下定義了Java 8的豐富的函數式接口
@FunctionalInterface
public interface MyInterface {
int method1(String a);
}
三图谷、格式
- -> :Lambda操作符或箭頭操作符
- -> 左邊:Lambda形參列表 (其實就是接口中的抽象方法的形參列表)
- -> 右邊:Lambda體(其實就是重寫的抽象方法的方法體)
四翩活、使用總結
- -> 左邊:Lambda形參列表的參數類型可以省略(類型推斷);如果Lambda形參列表只有一個參數便贵,其一對 () 也可以省明菠镇。
- -> 右邊:Lambda體應該使用一對 {} 包裹;如果Lambda體只有一條執(zhí)行語句(可能是return語句)承璃,可以省略這一對 {} 和 return 關鍵字利耍。
五、使用介紹(六種情況)
1. 無參無返回值
@Test
public void test1(){
//未使用Lambda表達式的寫法
Runnable r1 = new.Runnable() {
@Override
public void run() {
System.out.println("我愛北京天安門");
}
};
r1.run();
System.out.println("************************");
//使用了Lambda表達式之后
Runnable r2 = () -> {
System.out.println( "我愛北京故宮");
};
r2.run();
}
2. 有參無返回值
@Test
public void test2(){
//未使用Lambda表達式的寫法
Consumer<String> con = new Consumer<String>(){
@Override
public void accept(String s){
System.out.print1n(s);
}
};
con.accept("謊言和誓言的區(qū)別是什么?");
System.out.println(****************);
//使用了Lambda表達式之后
Consumer<String> con1 = (String s) -> {
System.out.println(s);
};
con1.accept("一個是聽得人當真了盔粹,一個是說的人當真了");
}
3. 類型推斷
//語法格式三:數據類型可以省略隘梨,因為可由編譯器推斷得出,稱為“類型推斷”
@Test
public void test3(){
//數據類型沒有省略
Consumer<String> con1 = (String s) -> {
System.out.println(s);
};
con1.accept("一個是聽得人當真了玻佩,一個是說的人當真了");
System.out.println("****************");
//數據類型省略之后
Consumer<String> con2 = (s) -> {
System.out.println(s);
};
con2.accept( t: "一個是聽得人當真了,一個是說的人當真了");
}
4. 單參單語句
//語法格式四: Lambda 若只需要一個參數時席楚,參數的小括號可以省略
@Test
public void test5(){
//只需要一個參數咬崔,但是不忽略小括號
Consumer<String> con1 = (s) -> {
System.out.println(s);
};
con1.accept("一個是聽得人當真了,任一個是說的人當真了");
System.out.println("****************");
//只需要一個參數烦秩,可以忽略小括號
Consumer<string> con2 = s -> {
System.out.println(s);
};
con2.accept("一個是聽得人當真了垮斯,一個是說的人當真了");
}
5. 多參多語句帶返回值
//語法格式五: Lambda 需要兩個或以上的參數,多條執(zhí)行語句只祠,并且可以有返回值
@Test
public void test6(){
Comparator<Integer> com1 = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
};
}
System.out.println(com1.compare(12,21));
System.out.println("************************");
Comparator<Integer> com2 = (o1,o2) -> {
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
};
System.out.println(com2.compare(12,21));
}
6. 多參單語句帶返回值
//語法格式六:Lambda體只有一條語句時兜蠕,return與大括號若有,都可以省略
@Test
public void test7(){
//未省略大括號與return
Comparator<Integer> com1 = (o1,o2) -> {
return o1.compareTo(o2);
};
System.out.println(com1.compare(12,6));
System.out.println("************************");
//省略了大括號和return
Comparator<Integer> com2 = (01,02) -> o1.compareTo(o2);
System.out.println(com2.compare(12,6));
}