多線程詳解03: Lambda表達式
文章目錄
- 多線程詳解03: Lambda表達式
-
- Lambda表達式:
- 為什麼要使用Lambda表達式
- Functional Interface(函數式接口)
- 推導Lambda表達式
- Lambda表達式簡化過程
Lambda表達式:
- λ是希臘字母表中第十一位字母,英文名稱Lambda.
- 使用Lambda表達式是為了避免匿名内部類定義過多.
- Lambda表達式的實質是函數式程式設計.
- 通用形式為:
(params參數) -> expression[表達式]
(params參數) -> statement[語句]
(params參數) -> {statements}
為什麼要使用Lambda表達式
- 避免内部類定義過多
- 提高代碼簡潔性,去掉了一堆沒有意義的代碼,隻留下核心邏輯.
Functional Interface(函數式接口)
- 了解Functional Interface(函數式接口)是學習JAVA8 lambda表達式的關鍵所在.
- 函數式接口的定義: 任何接口,如果隻包含唯一一個抽象方法,那麼它就是函數式接口.
- 對于函數式接口,我們可以通過lambda表達式來建立該接口的對象.
推導Lambda表達式
下面我們通過代碼來推導一下lambda表達式.
/**
* @ClassName LambdaTest1
* @Author clap of thunder
* @Date 2021/9/22 16:36
* @Description 推導lambda表達式
**/
public class LambdaTest1 {
public static void main(String[] args) {
Interface ifi = new InterfaceImpl();
ifi.interMethod();
ifi = new InterfaceImpl2();
ifi.interMethod();
/**4.局部内部類:方法内部建類*/
class InterfaceImpl3 implements Interface{
@Override
public void interMethod() {
System.out.println("lambda3");
}
}
ifi = new InterfaceImpl3();
ifi.interMethod();
/**5.匿名内部類:沒有類的名稱,必須借助接口或父類*/
ifi = new Interface() {
@Override//有父類是以也要重寫方法
public void interMethod() {
System.out.println("lambda4");
}
};
ifi.interMethod();
/**6.JDK8: Lambda表達式:函數式接口隻有一個方法,是以可以直接簡化*/
ifi = () ->{
System.out.println("lambda5");
};
ifi.interMethod();
}
/**3.靜态内部類
* @author: clap of thunder
* @date: 2021/9/22 17:33
*/
static class InterfaceImpl2 implements Interface{
@Override
public void interMethod() {
System.out.println("lambda2");
}
}
}
/** 1.定義一個函數式接口*/
interface Interface{
/**
* interMethod is good!
* @author: clap of thunder
* @date: 2021/9/22 17:23
* @return null
*/
void interMethod();
}
/** 2.實作類*/
class InterfaceImpl implements Interface{
@Override
public void interMethod() {
System.out.println("lambda1");
}
}
Lambda表達式簡化過程
上面的代碼讓我們看清了推導過程,但是關于Lambda表達式到底是怎樣提升代碼簡潔性的并沒有很清楚地說明.現在讓我們通過下面的執行個體來具體感悟一下:
/**
* @author clap of thunder
* @date 2021-09-22 18:15
*/
public class LambdaTest2 {
public static void main(String[] args) {
Money money = new Money() {
@Override
public void makeMoney(int a, int b, int c) {
System.out.println("I have " + a+b+c + " yuan");
}
};
money.makeMoney(1,2,3 );
}
}
interface Money {
void makeMoney(int a, int b, int c);
}
簡化步驟1:使用Lambda表達式
public class LambdaTest2 {
public static void main(String[] args) {
//簡化步驟1:使用Lambda表達式
money = (int a, int b, int c) -> {
System.out.println("I have " + a+b+c + " yuan");
};
money.makeMoney(1,3,2);
}
}
interface Money {
void makeMoney(int a, int b, int c);
}
簡化步驟2:Lambda去掉參數類型
public class LambdaTest2 {
public static void main(String[] args) {
//簡化步驟2:Lambda去掉參數類型
money = (int a, int b, int c) -> {
System.out.println("I have " + a + " yuan");
};
money.makeMoney(2,1,3);
}
}
interface Money {
void makeMoney(int a, int b, int c);
}
簡化步驟3: Lambda去掉小括号類型:隻能用于隻有單個參數時
friends =(a)-> {System.out.println("I have "+a+" makeMoney");};
friends.makeFriends(3);
friends = a -> System.out.println("I have "+a+" makeMoney");
friends.makeFriends(4);
步驟3的代碼來源于下面的示例:
/**
* @author clap of thunder
* @date 2021-09-22 18:40
* @description
*/
public class LambdaTest3 {
public static void main(String[] args) {
//匿名内部類
Friends friends = new Friends() {
@Override
public void makeFriends(int a) {
System.out.println("I have "+a+" makeMoney");
}
};
friends.makeFriends(1);
//簡化1:Lambda
friends =(int a)-> {System.out.println("I have "+a+" makeMoney");};
friends.makeFriends(2);
//簡化2:Lambda去掉參數類型
friends =(a)-> {System.out.println("I have "+a+" makeMoney");};
friends.makeFriends(3);
//簡化2:Lambda去掉小括号類型:隻能用于隻有單個參數時
friends = a -> System.out.println("I have "+a+" makeMoney");
friends.makeFriends(4);
//總結:1.Lambda表達式隻能在隻有一行的情況下才能簡化為一行,如果有多行就要用代碼塊包裹
//2.前提是接口為函數式接口
//3.多個參數也可以去掉參數類型但是去掉就必須加上括号
}
}
interface Friends {
/**
* just a test
* @author: clap of thunder
* @date: 2021/9/22 18:19
* @param a for test.
* @return null
*/
void makeFriends(int a);
}
總結:
- Lambda表達式隻能在隻有一行的情況下才能簡化為一行,如果有多行就要用代碼塊包裹
- 前提是接口為函數式接口
- 多個參數也可以去掉參數類型但是去掉就必須加上括号