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);
}
}