Lambda表达式的使用
lambda表达式的思想
在匿名内部类的基础上,我们不再去顾及对应的函数名,对象等等条件,我们只在意对应的传参以及对应抽象方法的方法体实现
类似如下:()->{}
仅为一个语法糖,其原理是根据你目前传进的对象中调用的方法把我们lambda中的参数一 一填入对应的方法中,在->后的则是我们在实现对应方法的方法体
请注意
我们是由匿名内部类中转换过来的,而我们lambda表达式中并未指定对应的是哪个方法,根据参数类型或者数量来判断实现哪个方法的话在类型且数量相等时,仍然会有问题,于是lambda表达式做出的限制是当一个接口被匿名内部类实现时,对应的抽象方法只能有一个,这时才可以转为匿名内部类
且lambda表达式只能由匿名内部类转化而来,不可以是抽象类即使只有一个抽象方法
例如下面错误示例
package learnLambda;
/**
* @author:天才玩家M
* @date:2023/11/23 10:11
* @description:TODO
*/
public abstract class MyRunable implements Runnable {
@Override
public void run() {
System.out.println("今天天气真好");
}
public abstract void ddd();
}
public static void main(String[] args) {
new Thread((MyRunable)()->{}).start();
}
这时已经在报:Target type of a lambda conversion must be an interface
案例
案例1
before
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("你知道吗 我比你想象的 更想在你身边");
}
}).start();
now
new Thread(()-> System.out.println("你知道吗 我比你想象的 更想在你身边")).start();
案例2
before
public static int calculateNum(IntBinaryOperator operator){
int a = 10;
int b = 20;
return operator.applyAsInt(a, b);
}
public static void main(String[] args) {
int i = calculateNum(new IntBinaryOperator() {
now
calculateNum((left,right)->left+right);
案例3
public static void printNum(IntPredicate predicate){
int[] arr = {1,2,3,4,5,6,7,8,9,10};
for (int i : arr) {
if(predicate.test(i)){
System.out.println(i);
}
}
}
public static void main(String[] args) {
printNum(new IntPredicate() {
@Override
public boolean test(int value) {
return value%2==0;
}
});
}
now
printNum(value -> value%2==0);
案例4
和案例3before一样但是我们弄个有所不同的条件,我们只想输出每个数二进制表现形式中最后两为都是1的数
now
printNum(value->{
//目标找到二进制表现形式中最后两位是1的数--->答案应该是3,7,
int a=value&1;//判断value最后一位是0还是1
int b=(value>>1)&1;//右移一位再次判断最后一位是0or1
return a==1&&b==1;
});
总结lambda表达式格式
参数类型可以省略
一个参数时可以不加括号类似案例3,4
一个语句时可以不加{},但是最后不能加分号
其余情况恰恰相反
学习技巧
-
不了解的参数可以先生成匿名内部类,然后alt+enter进行转换
-
ctrl+p获取对应方法参数

浙公网安备 33010602011771号