轉(zhuǎn)載于:https://blog.csdn.net/qq_42628989/article/details/105297717
Lamda作為Java8引入的語法,不會的話也不影響我們的正常開發(fā),但如果學會的話,可以極大地減少我們的無用代碼數(shù)量,讓我們一起來看一下!
1.Lamda表達式常用情景:實現(xiàn)Runnbale接口創(chuàng)建線程
我們經(jīng)??梢栽诰幊讨锌吹饺缦麓a:
public class test {
public static void main(String[] args) {
Thread thread = new Thread(()-> {/某耗費時間的代碼/});
thread.start();
}
}
這其實就是我們Lamda表達式的使用方式之一:快速創(chuàng)建匿名類
如果我們不使用Lamda表達式,當然也可以實現(xiàn)相同的功能,不過,要花費的固定格式的代碼就要多很多。
比如:
public class test {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
/耗費時間的代碼/
}
});
thread.start();
}
}
可以看到,如果實現(xiàn)接口,要將實現(xiàn)接口的固定格式全部寫出(接口名方法名等),而Lamda則可以使用一行代碼搞定,極大簡化我們的代碼,看起來不會亂糟糟~
2.Lamda表達式的使用
Lamda表達式的基本格式:()->{}
其中()括號內(nèi)填寫的是方法的參數(shù),{}大括號內(nèi)填寫的是方法實現(xiàn)語句
舉例說明:實現(xiàn)Runnable接口,就可以這樣來寫
public class test {
public static void main(String[] args) {
Runnable myRunnable = () -> {
for(int i=0;i<100;i++)
{
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}
}
因為run方法沒有參數(shù),所以并不需要在括號內(nèi)填寫參數(shù)。
現(xiàn)在來舉個例子模擬有參數(shù)的情況:
現(xiàn)在我們創(chuàng)建一個IEat接口,其中有一個eat方法,還有一個PersonEat方法,使用到了該接口的抽象方法,方法中內(nèi)容需要我們自己實現(xiàn),參數(shù)為eat的內(nèi)容!
public class test {
//此方法調(diào)用了IEat接口中的eat方法
public static void personEat(IEat e)
{
e.eat("蔬菜");
}
public static void main(String[] args) {
IEat e = new IEat() {
@Override
public void eat(String v) {
System.out.println("正在吃"+v);
}
};
personEat(e);
}
}
interface IEat
{
void eat(String v);
}
以上就是我們通過匿名類實現(xiàn)接口并使用的例子,可以發(fā)現(xiàn),我們寫了很多的不必要內(nèi)容,來實現(xiàn)eat方法!
而使用我們Lamda表達式就很方便:
public class test {
//此方法調(diào)用了IEat接口中的eat方法
public static void personEat(IEat e)
{
e.eat("蔬菜");
}
public static void main(String[] args) {
IEat e = (String v) -> {System.out.println("正在吃" + v);};
personEat(e);
}
}
interface IEat
{
void eat(String v);
}
此時就可以發(fā)現(xiàn),我們化簡了很多規(guī)定格式的代碼,使項目更加簡潔,省掉了很多不必要的內(nèi)容!
變式寫法:
1.我們在此基礎上,還可以去參數(shù)類型
IEat e = (v) -> {System.out.println("正在吃" + v);};
2.除了去掉參數(shù)類型 ,如果只有一個參數(shù),還可以去掉括號
IEat e = v -> {System.out.println("正在吃" + v);};
3.如果實現(xiàn)方法的代碼只有一條,連大括號都可以去掉
IEat e = v -> System.out.println("正在吃" + v);
4.如果在想懶一下,我們甚至可以直接將Lamda表達式直接寫入到參數(shù)內(nèi)
personEat(v -> System.out.println("正在吃" + v));
寫到這個時候我們就可以很明顯發(fā)現(xiàn),我們(畫紅框)7行代碼,使用Lamda表達式之后,只需要一行代碼就可以搞定!

此時如果有人問:
方法沒有參數(shù)怎么辦?
public class test {
//此方法調(diào)用了IEat接口中的eat方法
public static void personEat(IEat e)
{
e.eat();
}
public static void main(String[] args) {
//直接使用空括號就可以了
personEat(() -> System.out.println("正在吃蔬菜"));
}
}
interface IEat
{
//沒有參數(shù)
void eat();
}
有返回值怎么辦?
public class test {
//此方法調(diào)用了IEat接口中的eat方法
public static void personEat(IEat e)
{
//輸出處理結(jié)果
System.out.println(e.eat("蔬菜"));
}
public static void main(String[] args) {
//對字符串進行處理
personEat(v -> "正在吃" + v);
}
}
interface IEat
{
//返回字符串
String eat(String v);
}
總結(jié)來說:Lamda表達式是對抽象方法的快速實現(xiàn),并且為了追求效率,編譯器會根據(jù)接口定義自動推斷參數(shù)類型和返回值,所以,都可以進行省略,不會報錯!