lambda表達式
前言
最近因為疫情,也不能正常返校什么的,希望大家都能好好的,希望武漢加油,中國加油,在家也看了很多視頻,學了一點新的東西,雖然懶惰,但是也要努力啊。今天記錄分享Lambda表達式的知識。
Lambda表達式是JDK8新增的特性 下面的圖就是JDK8的新特性,JDK5和JDK8相對來說都是比較重要有的Java版本。
所以學習使用其中的新特性也是比較重要的。

簡介
Lambda表達式指的是應用在單一抽象方法接口環境下的一種簡化定義形式,可以用來解決匿名內部類的定義復雜問題。
今天這篇講的是lambda表達式,它是一種新的語法規則。它是一種匿名函數,簡單地說,它是沒有聲明的方法,也即沒有訪問修飾符、返回值聲明和名字。它可以寫出更簡潔、更靈活的代碼。作為一種更緊湊簡潔的代碼風格,使 Java 語言的表達能力得到了提升。
簡單入門
interface Message {
public void print();
}
public class TestDemo {
public static void main(String[] args){
//lambda表達式,這里是覆寫接口中的print方法
fun() -> System.out.println("hello world");
//原來的寫法
// fun(new Message(){
// @Override
// public void print)() {
// System.out.println("hello world");
//}
//});
}
public static void print(Message msg){
msg.print();
}
}
用法
-
Lambda的基本語法如下
(參數) -> 方法體/lambda體
解析:
左邊是成員列表/形參列表(有時就是接口中的抽象方法的方法引用)
右邊的方法體是要重寫的抽象方法的方法體
-> 是操作符,也叫做lambda箭頭操作符
-
簡單示例
// 1. 不需要參數,返回值為
() -> 1
// 2. 接收一個參數(數字類型),返回其2倍的值
x -> 2 * x
// 3. 接受2個參數(數字),並返回他們的差值
(x, y) -> x – y
// 4. 接收2個int型整數,返回他們的和
(int x, int y) -> x + y
// 5. 接受一個 string 對象,並在控制台打印,不返回任何值(看起來像是返回void)
(String s) -> System.out.print(s)
-
具體使用方法/寫法-一共可以分為六種情況去寫。
/**
* @Author: yhy
* @Time: 22:37
* 用來測試使用lambda語句
*/
public class LambdaDemo {
// -> lambda操作符
// 情況一:無參且無返回值
@Test
public void test1() {
// 原來的寫法
Runnable r0 = new Runnable() {
@Override
public void run() {
System.out.println("abc");
}
};
// lambda寫法
Runnable r = () -> System.out.println("abc");
r.run();
}
//情況二 需要一個參數,但沒有返回值
// 原始寫法
Consumer<String> con = new Consumer<>() {
@Override
public void accept(String s) {
System.out.println(s);
}
};
// lambda寫法
Consumer<String> con2 = (String s) -> {
System.out.println(s);
};
//情況三:數據類型省略,可推斷出類,又叫做類型推斷 前面已經知道是string類型了
// 所以這里直接省略了后面的括號的string類型說明
// 和泛型的格式很像,可以省略后面的類型說明
Consumer<String> con3 = (s) -> {
System.out.println(s);
};
// 情況四:一個參數的時候, 括號可以不寫 下面的s就是一個參數
@Test
public void test2() {
Consumer<String> con4 = s -> {
System.out.println(s);
};
con4.accept("abcdefg");
}
// 情況五:需要兩個或者以上的參數,且方法中多條執行語句,並且有返回值
@Test
public void test3() {
// 原來的寫法
Comparator<Integer> com = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(02);
}
};
System.out.println(com.compare(13,15));
// lambda表達式
System.out.println("------------------");
Comparator<Integer> com2 =(o1,o2) -> {
return o1.compareTo(02);
};
System.out.println(com2.compare(14,12));
}
// 情況六:當lambda只有一條語句時候,可以在lambda體中省略括號和return
@Test
public void test4(){
// 原來的寫法
Comparator<Integer> com1 = (o1,o2) -> {return o1;};
}
// lambda規則六表達式寫法
Comparator <Integer> com2 = (o1, o2) -> o1;
}
好處
能夠簡潔,快速寫代碼,看的出代碼量差別,但是有一說一,有時不會很好懂,但是看得懂還是最基本的要求。
總結
表達式的左邊:Lambda形參列表的參數類型可以省略,如果只有一個參數的時候,也可以省略括號
表達式的右邊:Lambda體,一對{}包裹着,只有一條執行語句的時候,也可以省略大括號,若有返回值,省略的時候也可以省略return
最后,以前用匿名內部類的地方都可以使用Lambda表達式類代替.
這一篇文字沒寫多少,因為我覺得學的太慢了,不能浪費太多時間在做博客上,所以以記錄分享為主,菜鳥一枚,加油,共勉!