一、概述
1、是什么
Lambda表達式是一個匿名函數(shù),即沒有函數(shù)名的函數(shù)。也可以理解成是一段可以傳遞的代碼(將代碼像數(shù)據(jù)一樣進行傳遞),這樣一來代碼更加簡潔。
2、為什么
- 代碼簡潔
- 可能還有一些優(yōu)化,但是目前沒研究,研究到的時候再來補充。
二、語法組成
param -> body
1.中間以 -> 隔開形成左右兩部分。我們稱->為箭頭操作符。2.表達式左邊:Lambda表達式的參數(shù)列表。3.表達式右邊:Lambda表達式中所需執(zhí)行的功能,即Lambda體。
三、語法格式
1、無參無返回
方法沒參數(shù)且沒返回值,比如public void test() {System.out.println("hello")},用lambda表達式,首先看我們的Lambda組成公式:param -> body。無參就用()代替,那么就是() -> body,方法體是輸出語句,所以:() -> System.out.println("hello"),別問我方法名稱在哪?第一個就說了,匿名函數(shù),即沒有函數(shù)名的函數(shù)。
2、一參無返回
方法有一個參數(shù)且沒返回值,比如:public void test(int a) {System.out.println(a)},用lambda表達式,首先看我們的Lambda組成公式:param -> body。有參數(shù)就放到()里就行了,那么就是(int a) -> System.out.println(a)
值得注意的是:1.若參數(shù)只有一個,則我們可以省略小括號,如下:int a -> System.out.println(a)2.我們可以省略參數(shù)類型,因為jdk會為我們自動推斷。如下:a -> System.out.println(a)
3、多參無返回
方法有一個以上參數(shù)且沒返回值,比如:public void test(int a, String b) {System.out.println(a + ":" + b)},用lambda表達式,首先看我們的Lambda組成公式:param -> body。有參數(shù)就放到()里就行了,那么就是(int a, String b) -> {System.out.println(a + ":" + b)}
值得注意的是:1.若參數(shù)只有一個,則我們可以省略小括號,但是一個以上就不能省略了。2.我們可以省略參數(shù)類型,因為jdk會為我們自動推斷。如下:(a, b) -> {System.out.println(a + ":" + b)}
4、多參有返回
方法有一個以上參數(shù)且有返回值,比如:public String test(int a, String b) {return a + ":" + b},用lambda表達式,首先看我們的Lambda組成公式:param -> body。有參數(shù)就放到()里就行了,那么就是(int a, String b) -> {return a + ":" + b}
值得注意的是:1.若參數(shù)只有一個,則我們可以省略小括號,但是一個以上就不能省略了。2.我們可以省略參數(shù)類型,因為jdk會為我們自動推斷。如下:(a, b) -> {return a + ":" + b}
5、體只有一條
首先看我們的Lambda組成公式:param -> body。體只有一條的意思是body只有一條語句。多條語句不可省略這種情況下我們可以省略{},且不管你有無返回值都可以省略return。多條語句不可省略。比如:public void test(int a) {System.out.println(a)}會寫成: a -> System.out.println(a)比如:public int test(int a) {return a + 100}會寫成: a -> a + 100
四、實戰(zhàn)演示
1、無參無返回
/** * 無參無返回,我們以Runnable接口為例,因為Runnable的run()方法就是無參無返回的。 */ private static void test1() { Runnable runnable = new Runnable() { @Override public void run() { System.out.println("test1"); } }; runnable.run(); } public static void main(String[] args) { test1(); /** * lambda的方式重寫無參無返回。 * 說明一下:這里的無參無返回指的是Runnable接口的run方法無參無返回,至于細(xì)節(jié)問題,先不管,下一章節(jié)你秒懂。 * 現(xiàn)在你只需要知道lambda真的很簡單! */ Runnable runnable = () -> System.out.println("test1"); runnable.run(); }
2、一參無返回
/** * 一參無返回 */ private static void test2(int a) { System.out.println("a=" + a); } public static void main(String[] args) { test2(1); /** * lambda的方式重寫一參無返回。 * 說明一下:這里的無參無返回指的是Consumer接口的accept方法一參無返回,你會問Consumer是什么,先不管,下一章節(jié)你秒懂。 * 現(xiàn)在你只需要知道lambda真的很簡單! */ Consumer<Integer> consumer = (a) -> System.out.println("a=" + a); consumer.accept(1); //---------------------------一參可省略小括號-----------------------------------// Consumer<Integer> consumer2 = a -> System.out.println("a=" + a); consumer2.accept(1); } // 多參無返回同理,不寫了。,直接搞多參有返回吧
3、多參有返回
public static void main(String[] args) { /** * 多參有返回,這里拿比較接口來做案例 */ Comparator<Integer> comparator2 = new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { System.out.println("多參有返回"); return Integer.compare(o1, o2); } }; /** * lambda的方式重寫多參有返回。 * 說明一下:這里的多參無返回指的是Comparator接口的compare方法多參有返回,細(xì)節(jié)先不管,下一章節(jié)你秒懂。 * 現(xiàn)在你只需要知道lambda真的很簡單! */ Comparator<Integer> comparator = (a, b) -> { // 需要注意的是:body多行,{}不能省略。 System.out.println("多參有返回"); return a.compareTo(b); }; }
五、總結(jié)
本章要學(xué)會以下東西
- 什么是lambda
- 為什么用lambda
- lambda語法組成
- lambda語法格式
- 并不要求你會用
- 要明白真的節(jié)省代碼,如下:對接口的創(chuàng)建匿名內(nèi)部類的實現(xiàn)時,只需一句話,比如:
Runnable r = () -> System.out.println("hello");
而具體什么樣的接口能用lambda呢?我們隨便寫個interface的話可以用嗎?顯然不行,這就引人深思了,為什么案例中的Runnable和Comparator接口都可以用lambda替代其內(nèi)部類的實現(xiàn)?小伙伴們你們覺得可以代替嗎?盡情吧答案評論在下方吧。