javaSE笔记 Lambda表达式
Lambda表达式
标准格式:
匿名内部类重写run()方法的代码解析:
new Thread(new Runnable(){
@Override
public void run(){
System.out.println("多线程程序启动了")
}
}).start();
可以看到这个例子里的run方法没有参数,并且返回值类型为void,方法体就是我们要做的事
接下来看个匿名内部类的例子
new Thread(()->{
System.out.println("多线程程序启动了");
})
()里面没内容,说明没有参数,->指向要做的事,代码块中是具体内容,不过这样似乎看不到返回类型啊。
组成lambda表达式的三要素:形式参数,箭头,代码块
Lambda表达式练习
Lambda表达式使用前提:1.有一个接口 2.接口中有且仅有一个抽象方法
这边有且只有一个抽象方法是挺重要的,因为在Lambda表达式中,核心因素只有形参,箭头,代码块,没有写对象名字,当然匿名内部类就已经没有对象名字了,但是他还没有调用的抽象方法,完完全全只有方法体
写在代码块中,那应该也只能有一个抽象方法了,这样的话比较好判断用啥方法。
具体例子是在一个方法中要使用接口实现类的对象作为参数,这时候可以用Lambda表达式
这边的抽象方法带参无返回值练习,一开始还是有点闷得,因为直接是这样写的
useFlyable((String s) ->{
System.out.println(s);
System.out.println("飞机自驾游")
}); // 这边直接打印 s 就能获得他的值,但是这样看并不能看到在什么时候给 s 赋值了
只能理解为这种写法会自动调用useFlyable(Flyable f)中 f 的方法,即
private static void useFlyable(Flyable f){
f.fly("风和日丽,晴空万里")
}
这边解释一下为什么直接打印 s 就能获得它的值,在后面的课程中有这么一句话,这个fly方法到底对"风和日丽,晴空万里"做了什么得看具体实现,而上面那个Lambda就是在定义这个fly方法而已。
这边开始回答上面的疑问,怎么去返回类型,其他写法和上面一样,只不过是()->{}这边的大括号里,要写一句return xxx; 简直tm low 的一逼
Lambda表达式的省略模式
1.类型可以省略,但是有多个参数的时候,不能只省略一个。
2.如果参数有且只有一个,那么小括号都可以省略。
3.如果代码块的语句只有一条,就可以省略大括号和分号,但是这单独的一句只有return xxx的时候,还得把return给省略掉
Lambda表达式的注意事项
1.使用Lambda必须要有接口,并且要求接口中有且只有一个抽象方法。
2.必须有上下文环境,才能推导出Lambda对应的接口,看下面例子

比如你直接写一个 () -> System.out.println("Lambda表达式"),这样是不行的,但是你可以写成Runnable r = () -> System.out.println("Lambda表达式"),总的来说看到Lambda表达式,将其看成匿名内部类是最方便的。
另外这边Lambda一定要有接口,应该还是他所有的底层操作都是可以当成匿名内部类来看的,即创建一个类,实现接口,再父接口引用实现类对象,再作为参数传递给方法
Lambda表达式和匿名内部类的区别

这边不懂的就是这个第三点,Lambda表达式不会生成单独的字节码文件,不知道它的好坏

浙公网安备 33010602011771号