1.传统方式
@Slf4j
public class LambdaTest {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
log.info("传统方式 子线程---->>>");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
log.info("主线程");
}
}
其实在这个时候,如果你是用了idea的话,可以看到new Runnable是灰色的,当你的鼠标指向后,会提示你替换为Lambda表达式
2. lambda方式
点击Replace with lambda,代码则被简化成了如下:
@Slf4j
public class LambdaTest {
public static void main(String[] args) {
new Thread(() -> {
log.info("传统方式 子线程---->>>");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
log.info("主线程");
}
}
3.@FunctionalInterface接口
进入Runnable接口,可以看到他是由
@FunctionalInterface注解标注的,被标注的接口只能有一个抽象方法(也就是可以有一个没有实现的方法,且可以其他的默认方法)
当我在里面定义了两个非抽象方法时,会报错,不定义方法时,也会报错,被标注的接口上只能有一个抽象的方法声明
但是可以有默认的方法,如下:
4.方法参数上的lambda表达式
相比2步骤的中的new Thread(Runnable实现).start();只是将构造方法的内容改成了普通方法的内容,如下:
1.接口定义
@FunctionalInterface
public interface Function {
void test();
default void test2(){};
default void test3(){};
}
2.普通类中使用接口方法:
public class FunctionTest {
void exec(Function function){
function.test();
}
}
3.测试类:
@Slf4j
public class LambdaTest {
public static void main(String[] args) {
new FunctionTest().exec(()->{
log.info("执行了方法");
});
}
}
执行结果:
说明:
() -> { }
// () 为参数列表 -> 为运算符(读作goes to) { } 为方法体
lambda表达式简化了方法的修饰符,返回值,方法名
注:
1、所有参数都可以不写参数类型
2、只有一个参数时可省略(),方法体只有一条语句时可以省略{}
Lambda 表达式常用示例
以下为更为精简的写法(需要满足一定条件)
如上面的代码,只有log.info()依据代码,最终可以可以简化为(去掉了{},但是如果不只一行代码的话,是不能去除大括号的)
@Slf4j
public class LambdaTest {
public static void main(String[] args) {
new FunctionTest().exec(()->
log.info("执行了方法")
);
}
}
省略()的情况:以test(String i)方法为例:
@FunctionalInterface
public interface Function {
void test(String i);
default void test2(){};
default void test3(){};
}
方法参数为我们定义的Function类型
public class FunctionTest {
void exec(Function function){
System.out.println("调用");
}
}
测试:
以下情况即可省略()
@Slf4j
public class LambdaTest {
public static void main(String[] args) {
String i = "";
new FunctionTest().exec(p->{
});
}
}