大家好,又见面了,我是你们的朋友全栈君。
(参数)->{
方法语句}这样的形式就是lamda表达式,不用定义参数和返回值的数据类型
–可以省略的情况:
只有一个参数的时候参数可以不用括号;
只有一个语句的时候大括号可以不用;
只有一个语句且是return的时候可以省略return,直接写需要返回的值(表达式)
目录
1、for循环实例
这个实例展示了传入一个参数且无返回值的用法
定义一个字符串数组并实例化,对这个数组进行操作。
通常的打印所有元素的方法:
增强for循环,专门针对列表\数组的循环类型,可以将元素逐个取出参与操作且无需使用脚标。
正常的方法是方法名写外面,操作对象写里面。现在有一种将操作对象写外面,执行的方法写里面的方法。
注意:对于静态方法可以如图使用,据说动态方法必须先创建对象才能使用。 (但还没有找到例子) |
players.forEach相当于对players进行增强for循环的结果,即每一个元素,是被操作对象。
方法在里面,双冒号代表【方法所属的包(类)::方法名】
这个语句的意思是对遍历的每个元素(字符串)执行sout。
还可以将括号内的方法换成由lamda表达式确定的方法
(player) -> System.out.print(player + “; “)是lamda表达式,
意思是当接收到一个参数时(箭头左边),将这个参数打印出来(右边)
参数player未指定数据类型,或者说传入的数据类型不限制,右侧的语句显示要将player作为形参参与打印。
此时括号外面的forEach向括号内部传入了一个参数,即某次循环取出的元素,然后执行表达式的语句打印出来。
箭头左侧的参数可以不指定类型, 箭头右侧的返回值也可以不指定类型 系统可以猜测类型并自动把数据变成相应的类型。 |
2、多线程实例
这个实例展示了不传入参数的用法
race1.run() race1.start() race2.eun()均可运行
但是race2.start()不可运行, 因为Runable没有start方法 |
不传入参数基本上相当于直接执行,与lamda表达式关系不大,仅做展示用。
Thread()的参数需要Runable target类型,lamda表达式可以自动改变返回值类型,使其可以作为Thread的参数存在
①中直接将整个lamda表达式放入Thread的参数位置,用一行完成了定义和start执行。相当于②
②是分开步骤,创建线程需要new Thread(),新建对象的参数是tar,tar就是返回成Runable target类的lamda表达式,然后再用start来启动线程即可达到和①相同的执行效果
③是用Runable创建线程的方法,由于Runable是接口,不能实例化,所以不用new,赋值成lamda表达式后执行即可
3、sort排序实例
这个实例展示了传入多个参数的用法
Arrays.sort(words,
(first,second)->first.length()-second.length()
);
这个语句是Arrays的sort方法,sort(数组,排序接口)
本例是在一个字符串数组内,对元素按照字符串长度排序
lamda表达式接受两个参数,我们要按照什么规则把实参输入到这两个形参中呢?
其实不用管!
排序接口是interface Comparator<T>,
实例化这样的对象本身就需要输入两个参数,接口根据自定义的规则返回正负零
sort方法会自动安排words中的元素输入到这两个形参,再按照接口返回的正负零来给words中的元素排序。
因此,若定一个一个多个输入参数的lamda表达式,则一定要由调用lamda表达式的方法规定输入参数的规则
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/142899.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...