java Lambda表達(dá)式的使用心得
Lambda表達(dá)式的心得
如題,因為博主也是最近才接觸到Lambda表達(dá)式的(PS 在這里汗顏一會)。我并不會講解它的原理,誠然任何一件事物如果理解原理的話,使用它必將更加容易。但博主在學(xué)習(xí)的時候,大多數(shù)時候都是學(xué)會怎么用,然后在細(xì)究原理。就像你騎自行車之前,難道首先還要研究自行車的原理么?
首先Lambda表達(dá)式的最簡單應(yīng)用如下
Lambda表達(dá)式法
String lam= "初次相識Lambda";
new Thread(() -> System.out.println(lam)).start();
傳統(tǒng)方法
String tradition="傳統(tǒng)方法";
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(tradition);
}
}).start();
輸出結(jié)果

很簡潔有沒有?省略了好多代碼是不是,在這里 你可以發(fā)現(xiàn)”,Lambda表達(dá)式和在Thread創(chuàng)建一個匿名類的作用是一樣。我們可以這樣認(rèn)為Lambda表達(dá)式本身代表了一個匿名類。
這就是Lambda最大的作用,當(dāng)然Lambda表達(dá)式只能創(chuàng)建接口interface對象。 創(chuàng)建類是不行的,抽象類也是不行的 ,只要是類都是不行的。
首先,我定義了一個自定義的接口,可以用來測試
@FunctionalInterface
public interface Lam {
//Lambda表達(dá)式調(diào)用的方法
void bda();
//接口的默認(rèn)方法
default void test(){
System.out.println("我是默認(rèn)的方法");
};
//接口的靜態(tài)方法
static void test1(){
System.out.println("我是靜態(tài)方法");
}
}
使用Lambda表達(dá)式 你首先要知道的
1.Lambda表達(dá)式只能是接口 interface的創(chuàng)建(PS從上面的例子可以看出來,Runnable是接口,可以查看源代碼),并且這個接口只能包含一個方法(除了default方法和static方法)。在接口中創(chuàng)建default方法和static方法都必須要實現(xiàn)方法體如下圖

2.如果你用Lambda表達(dá)式來創(chuàng)建類 class,則會出現(xiàn)以下錯誤 ”Target type of a lambda conversion must be an interface“如果你怕自己的定義的接口不符合Lambda表達(dá)式的規(guī)范 ,你可以在接口interfaca 上面添加注解@FunctionalInterface
3.Lambda表達(dá)式的規(guī)范表示格式 (parameters) ->{ statements; }。在某些時刻,你還可以簡化這個格式
//接口定義的方法無參數(shù)時候,并且你想要執(zhí)行操作也只有一句代碼的時候,Lambda會自動返回一句代碼,并且可以不用加{}
Lam lam1=()->System.out.println("無參數(shù)");
你可以發(fā)現(xiàn)后面的大括號{ }沒了,這是因為后面代碼如果只有一句的話,是可以省略{ } 的
我們把Lam接口定義的調(diào)用方法參數(shù)修改一下,多出了一個String類型的形參s
//Lambda表達(dá)式調(diào)用的方法
void bda(String s);
這時候 我們?nèi)绻褂肔ambda表達(dá)式,則可以這樣
//接口定義的方法有參數(shù)時候,并且你想要執(zhí)行的操作也只有一句代碼的時候
Lam lam1=e->System.out.println(e);//這一句還有簡化版本 Lam lam1=System.out::println;
lam1.bda("4556");
你又會發(fā)現(xiàn),前面的()中括號也沒了,這是因為當(dāng)參數(shù)只有一個的時候,是可以省略()的。
當(dāng)然也有你要執(zhí)行很多代碼的時候,那這時候可以這樣
//接口定義的方法有參數(shù)時候,并且你想要執(zhí)行的操作有很多句代碼的時候
Lam lam1 = (String e) -> {
String a = e + "add";
System.out.println(a);
};
lam1.bda("test+");
輸出結(jié)果如下

當(dāng)然你還會問Lambda表達(dá)式能不能返回東西呢?這是肯定能的,首先我們再把上面的Lam接口方法修改一下
//Lambda表達(dá)式調(diào)用的方法
String bda(String s);
讓bda方法返回一個String值,這次如果我們用Lambda的話
//接口定義的方法有返回值的時候
Lam lam1=s ->{System.out.println(s);return "我是返回的數(shù)據(jù)";};
lam1.bda("test1");
System.out.println(lam1.bda("test2"));
運行的結(jié)果:

總結(jié) Lambda表達(dá)式 就是用來創(chuàng)建一個匿名的接口對象,即 它本身就是一個接口的匿名實例。只不過這個接口 有一些條件限制。
Lambda表達(dá)式的技巧
Lambda表達(dá)式只能用來簡化僅包含一個public方法的接口的創(chuàng)建
規(guī)則
- 1.只能是接口
- 否則報:Target type of a lambda conversion must be an interface
- 2.只能有一個public方法
- 否則報:Multiple non-overriding abstract methods found AInterface
- 或AInterface is not a functional interface
括號形式
testA((int i, int j) -> {});參數(shù)要與接口一致
public class Go {
public static void main(String a[]) {
//正確示范
testA((int i, int j) -> {});
//錯誤示范:Multiple non-overriding abstract methods found xxx;只能有一個public方法
testB((int i, int j) -> {});
//錯誤示范:Target type of a lambda conversion must be an interface;只能是接口
testC((int i, int j) -> {});
}
public static void testA(AInterface t) { }
public static void testC(CInterface t) {}
public static void testB(BInterface t) {}
interface AInterface {
void xxx(int i, int j);
}
interface BInterface {
void xxx(int i, int j);
void YYY(int i, int j);
}
abstract class CInterface {
abstract void xxx(int i, int j);
}
}
雙冒號表達(dá)形式
- 雙冒號后面必須是靜態(tài)方法
- 否則報錯:Non-static method cannot be referenced from a static context
- 雙冒號后面的方法與接口方法參數(shù)一樣
- 方法與接口的權(quán)限可以不一樣
- 返回類型:如果接口里面方法是void,雙冒號后的方法可以任意返回類型,否則要一致
public class Go {
public static void main(String a[]) {
//之前的寫法
testA(new AInterface() {
@Override
public void xxx(int i, int j) {
}
});
//正確,相對與接口里面xxx方這是改成靜態(tài)和換了個名字
testA(Go::mydog);
//正確,加了返回類型和public換成private,也是ok
testA(Go::mydog2);
//錯誤:Non-static method cannot be referenced from a static context
testA(Go::mydog3);
//這樣寫也是ok的。
AInterface aInterface = Go::mydog;
testA(aInterface);
}
public static void testA(AInterface t) {
t.xxx(1, 2);
}
interface AInterface {
void xxx(int i, int j);
}
public static boolean mydog(int i, int j) {
System.out.println("mydog" + i + " & " + j);
return false;
}
private static void mydog2(int i, int j) {
System.out.println("mydo2" + i + " & " + j);
}
public void mydog3(int i, int j) {
System.out.println("mydog3" + i + " & " + j);
}
}
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
學(xué)習(xí)Java設(shè)計模式之觀察者模式
這篇文章主要為大家介紹了Java設(shè)計模式中的觀察者模式,對Java設(shè)計模式感興趣的小伙伴們可以參考一下2016-01-01
mybaits-plus?lambdaQuery()?和?lambdaUpdate()?常見的使用方法
MyBatis-Plus是一個?MyBatis?(opens?new?window)的增強工具,在?MyBatis?的基礎(chǔ)上只做增強不做改變,為簡化開發(fā)、提高效率而生,這篇文章主要介紹了mybaits-plus?lambdaQuery()?和?lambdaUpdate()?比較常見的使用方法,需要的朋友可以參考下2023-01-01
springboot+dubbo+zookeeper的簡單實例詳解
本文主要介紹了springboot+dubbo+zookeeper的簡單實例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10
MyBatis 添加元數(shù)據(jù)自定義元素標(biāo)簽的實現(xiàn)代碼
這篇文章主要介紹了MyBatis 添加元數(shù)據(jù)自定義元素標(biāo)簽的實現(xiàn)代碼,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
Java 靜態(tài)數(shù)據(jù)初始化的示例代碼
這篇文章主要介紹了Java 靜態(tài)數(shù)據(jù)初始化的示例代碼,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下2020-09-09
Java實戰(zhàn)之兼職平臺系統(tǒng)的實現(xiàn)
這篇文章主要介紹了如何利用Java編寫一個兼職平臺系統(tǒng),采用到的技術(shù)有Springboot、SpringMVC、MyBatis、ThymeLeaf等,感興趣的小伙伴可以了解一下2022-03-03

