package zcl.jdk8.lambda;
/**
* 使用 Lambda 表達式可以使代碼變的更加簡潔緊湊。
* 參考學習文檔:https://www.runoob.com/java/java8-lambda-expressions.html
*/
public class TestMain4Lambda {
/*
一、lambda的標準格式爲:
(Object obj)-> {
doSomeThing();
return result;
}
二、爲了簡化語法,lambda可以省略一些語句,省略規則爲:
a. 小括號中的參數類型可以省略。
b. 如果小括號中只有一個參數,那麼可以省略 小括號。
c. 如果大括號中只有一條語句,那麼可以省略 大括號、return、分號
三、lambda的使用前提:
a. 必須有接口(不能是抽象類),接口中有且僅有一個需要被重寫的抽象方法。
b. 必須支持上下文推導,要能夠推導出來 Lambda 表達式表示的是哪個接口中的內容。
四、使用場景:
a. 可以使用接口當做參數,然後傳遞 Lambda 表達式(常用)
b. 可以將 Lambda 表達式賦值給一個接口類型的變量
**/
public static void main(String[] args) {
/*
使用場景a示例:可以使用接口當做參數,然後傳遞 Lambda 表達式(常用)
*/
SceneA sceneA = new SceneA();
sceneA.setName("Johny");
sceneA.setId(123);
//jdk7
sceneA.getInfo(new ILambdaTest() {
@Override
public Object test(String name, Integer id) {
return name+"," +id;
}
});
// jdk8標準寫法
sceneA.getInfo((String name, Integer id) -> {
return name+"," +id;
});
// jdk8簡化寫法
sceneA.getInfo((name, id)-> name+"," +id);
// 常見案例
new Thread(() -> System.out.println("線程啓動了")).start();
/*
使用場景b示例:可以將 Lambda 表達式賦值給一個接口類型的變量
*/
// 標準寫法
ILambdaTest getInfo = (String name, Integer id) -> {
return name+"," +id;
};
// 簡化寫法
ILambdaTest getInfoSimple = (name, id)-> name+"," +id;
System.out.println(getInfo.test("viga", 456));
System.out.println(getInfoSimple.test("viga", 456));
}
}
package zcl.jdk8.lambda;
public interface ILambdaTest {
// 不能是抽象類,必須是接口,有且僅有一個抽象方法
Object test(String name, Integer id);
}
package zcl.jdk8.lambda;
import lombok.Data;
@Data
public class SceneA {
private String name;
private Integer id;
public Object getInfo(ILambdaTest iLambdaTest){
System.out.println("info-" + name + "," + id);
return iLambdaTest.test(name, id);
}
}