lambda表达式详解

简介: lambda表达式详解

引言

小猿觉得学习一个新知识知道他的作用比知道他是什么更加重要,那lambda到底可以干什么,我们先从简单的而一个例子看看:

需求:使用Runnable的run方法打印内容

不使用lambda表达式代码如下

//方式一:定义一个类实现Runnable接口,重写run方法即可
public class Demo implements Runnable{
  @Override
  public void run() {
    System.out.println("============");
    
  }
  public static void main(String[] args) {
    new Demo().run();
  }
}
//方式二:使用匿名内部类实现
@Test
public void demoTwo(){
  Runnable runnable  =  new Runnable() {
    public void run() {
      System.out.println("===========");
    }
  };
  runnable.run();
}

使用Lambda表达式

@Test
public void demoOne(){
  Runnable r =()->System.out.println("==========");
  r.run();
}

使用更少的代码实现相同的功能,是不是很牛。。。当然如果你还感觉不到他的好处,,,,我详细具体学完之后你也会爱上lambda

那到底什么是Lambda

Java SE 8引入了一个箭头操作运算符,“->”也称Lambda表达式操作符。左边是参数列表,右边的具体功能实现即lambda体。

引入Lambda表达式就可以替代功能接口。正如上面的案例一样,使用Lambda替代Runnable接口功能。

Lambda表达式语法

格式1:无参无返回值

//使用Lambda替代runnable接口中无参无返回的run方法
@Test
public void demoOne(){
  Runnable r =()->System.out.println("==========");
  r.run();
}

格式2:一参无返回值

//使用Lambda替代Consumer接口中有一个参数无返回值的accept方法
@Test
public void demoOne() {
  Consumer<String> c = (e) -> System.out.println(e);
  c.accept("============");
}

当然对已一个参数的情况,箭头操作符右边的括号可以省略,等价的代码

@Test
public void demoOne() {
  Consumer<String> c = e -> System.out.println(e);
  c.accept("============");
}

格式3:多个参数有返回值

//使用Lambda替代比较器接口有两个参数并且返回值的
@Test
public void demoOne() {
  Comparator<Integer> comparator = (x,y)->{
    return Integer.compare(x, y);
  };
}

当然当Lambda体只有一条语句,可以省略右边的大括号以及return,等级代码

@Test
public void demoOne() {
  Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
}

格式4:多个参数有返回值,并且Lambda体多条语句

@Test
public void demoOne() {
  Comparator<Integer> comparator = (x, y) -> {
    System.out.println("=============");
    return Integer.compare(x, y);
  };
}

格式5:参数列表的数据类型可写可不写。Lambda会通过上下文进行类型推断,建议没必要写

@Test
public void demoOne() {
  Comparator<Integer> comparator = (Integer x, Integer y) -> {
    System.out.println("=============");
    return Integer.compare(x, y);
  };
}

总结:上面关于Lambda表达的语法操作都是基于接口的,并且这个接口只有一个没有方法体的抽象方法,这样的称为函数式接口。Lambda表达式需要函数式接口的支持,我们也可以通过@FunctionalInterface注解判断一个接口是不是函数式接口

@FunctionalInterface
public interface MyDemoInterface {
  void test();
 
}
//也可以在函数式接口中使用泛型
 
@FunctionalInterface
public interface MyDemoInterface<T> {
  void test(T t);
}

 

可以关注小猿微信公众号 java一号 查看更多java资源干货,更重要的是平时可以互相交流,交个朋友


文章首发地址:www.javayihao.com


相关文章
|
机器学习/深度学习 自然语言处理 PyTorch
PyTorch应用实战六:利用LSTM实现文本情感分类
PyTorch应用实战六:利用LSTM实现文本情感分类
843 0
|
存储 Ubuntu 网络协议
Ubuntu本地部署Nextcloud并结合内网穿透实现远程访问搭建个人云盘
Ubuntu本地部署Nextcloud并结合内网穿透实现远程访问搭建个人云盘
1031 1
|
28天前
|
人工智能 弹性计算 运维
阿里云百炼通义千问Qwen3.7-Plus深度详解:多模态推理、Agent适配与618年度订阅优惠指南
通义千问Qwen3.7-Plus是阿里云百炼平台推出的均衡型通用大模型,定位兼顾文本推理、多模态解析、智能体自主执行三大核心能力,是当前面向开发者、中小企业、行业业务落地的主流主力模型。区别于轻量化极速模型与旗舰超长推理模型,该版本在算力消耗、输出精度、多模态兼容性之间形成平衡,既能满足日常办公、内容生成、代码编写等轻量需求,也可支撑AI Agent长周期任务、图文混合业务分析、中小型科研推演等复杂场景。
1094 0
|
1月前
|
机器学习/深度学习 人工智能 数据可视化
YOLO26如何涨点系列篇(NEU-DET缺陷检测) | CVPR2026 DEGConv方向引导边缘门控,破解细长裂缝检测难题 ,实现涨点
在NEU-DET数据集下验证:原始mAP50原始为 0.722提升至 0.732 , R 原始为 0.643 提升至 0.682 , mAP50-95原始为0.407提升至0.413
288 6
|
2月前
|
存储 人工智能 关系型数据库
阿里云瑶池数据库 Data Agent,让你轻松拥有企业级数据智能助手!
Data Agent是瑶池数据库基于 Data+AI 数智融合与 Agentic AI 技术趋势打造的数据智能体产品, 覆盖从数据产生、存储、加工、治理、分析的全生命周期,具备自主规划、智能执行、迭代优化等特性。
|
3月前
|
人工智能 自然语言处理 JavaScript
OpenClaw 2.6.4 本地运行部署 电脑自动化 AI 配置(包含最新版安装包)
本文详解Windows一键部署OpenClaw 2.6.2教程,5分钟快速搭建本地AI智能体。无需编程基础、免配Python/Node.js环境,支持可视化操作、自然语言指令控制,实现文件整理、浏览器自动化等办公任务,数据全程本地运行,保障隐私安全。
|
4月前
|
API Python
别急着按X键:用两行代码清空Blender场景,比手动操作更上瘾
本教程带你用Python脚本替代Blender手动操作:两行代码即可清空默认场景,再扩展实现批量删除、精准筛选与自动重建。从控制台试运行到编写可复用脚本,详解常见报错(如NameError、context错误)及解决方法,助你迈出自动化3D创作第一步。(239字)
357 1
|
8月前
|
运维 监控 Linux
守护你的服务器(Linux进程监控与实时告警入门指南)
本文介绍Linux进程监控的重要性及基础实现方法,通过Shell脚本检测进程状态并记录告警日志,结合Cron定时任务实现自动化监控,适合运维新手入门。
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
910 25
|
Linux Shell Apache
LDAP学习笔记之七:Centos7 搭建openldap+图形界面
LDAP学习笔记之七:Centos7 搭建openldap+图形界面
2020 0