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获取对应方法参数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通