Lambda
- Lambda格式
①格式:(形式参数)->{代码块}
②形式参数:如果有多个形式参数,参数之间用逗号隔开;如果没有参数,留空即可
③->:由英文中画线和大于符号组成
④代码块:是我们具体要做的事情,也就是以前我们写的方法体的内容
- 注意事项
①使用Lambda必须有接口,并且要求接口中有且仅有一个抽象方法。
②必须有上下文环境,才能推导出Lambda对应的接口(根据局部变量的赋值得知Lambda对应的接口:Runnabler r = ()->Syetem.out.println("Lambda表达式"))(根据调用方法的参数得知Lambda对应的接口:new Thread(()->Syetem.out.println("Lambda表达式")).start())
- 省略模式
①参数类型可以省略,但是有多个参数的情况下,不能只省略一个。
②如果参数有且只有一个,那么小括号可以省略。
③如果代码块的语句只有一条,可以省略大括号和分号,甚至是return
- 使用场景
//接口
public interface lambdaTest {
void test(String str);
}
public class Demo {
public static void main(String[] args) {
//方式一匿名内部类
test(new lambdaTest() {
@Override
public void test(String str) {
System.out.println(str);
}
});
//方式二lambda
test((String s)->{
System.out.println(s);
});
}
public static void test(lambdaTest lt){
lt.test("这是lambda测试");
}
}
public interface lambdaTest {
void test(String str);
}
public class Demo {
public static void main(String[] args) {
lambdaTest lt = (String s)-> System.out.println(s);
lt.test("hello");
}
}
- 所需类型不同
①匿名内部类:可以是接口,也可以是抽象类,还可以是具体类。
②Lambda表达式:必须是接口
- 使用限制不同
①如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
②如果接口中多于一个抽象方法,智能使用匿名内部类
- 实现原理不同
①匿名内部类:编译后,产生一个单独的.class字节码文件
②Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行时动态生成。
网友评论