Java中的Lambda表达式

lambda表达式是一个可传递的代码块,可以在以后执行一次或多次。

1.lambda表达式的语法

eg:有如下lambda表达式:

(int a, int b) -> {return a+b};

这个表达式的本质是一个函数。

一般的函数类似如下:

int add(int a, int b) {return a+b;
}

有返回值、方法名、参数列表、方法体。

而Lambda表达式只有参数列表和方法体:

(参数列表)->{方法体}

说明:

  • () :用来描述参数列表;

  • {} :用来描述方法体;

  • -> :Lambda运算符可以叫做箭头符号,或者 goes to(指向);

2.函数式接口

对于只有一个抽象方法的接口,需要这种接口的对象时,就可以提供一个lambda表达式。这种接口叫做函数式接口。

通过使用lambda表达式展示应用场景。

public class Lambda {public static void main(String[] args) {If1 if1 = ()->{System.out.println("无参无返回值");};//调用方法if1.test();If2 if2 = (int a)->{System.out.println("单个参数无返回值:a = " + a);};if2.test(2);If3 if3 = (int a, int b)->{System.out.println("两个参数无返回值:a + b = " + (a + b));};if3.test(1, 2);If4 if4 = ()->{return 4;};System.out.println("无参有返回值,返回值为:" + if4.test());If5 if5 = (int a)->{return a;};System.out.println("有参有返回值,返回值为:a = " + if5.test(5));}//无参无返回值interface If1 {void test();}//单个参数无返回值interface If2{void test(int a);}//两个参数无返回值interface If3{void test(int a, int b);}//无参有返回值interface If4{int test();}//有参有返回值interface If5{int test(int a);}
}

运行结果如图:

在这里插入图片描述

关于如下代码的问题:

        If1 if1 = ()->{System.out.println("无参无返回值");};//调用方法if1.test();

在上述代码中,If1不是一个接口吗?为什么能够有对象if1呢?

实际上这里是使用了lambda来实现匿名内部类的作用,如下:

        If1 if1 = new If1() {@Overridepublic void test() {System.out.println("无参无返回值");}};//调用方法if1.test();

而匿名内部类写成正常的实现类就是类实现If1接口然后创建if1类对象,代码如下:

//定义接口
interface If1{void test();
}
//实现了接口的类
class NiMing implements If1{void test() {System.out.println("无参数无返回值")}
}
//创建类对象
public class Test{NiMing if1 = new NiMing();
}

3.lambda表达式精简语法

  • 参数类型可以省略

  • 假如只有一个参数,()括号可以省略

  • 如果方法体只有一条语句,{}大括号可以省略

  • 如果方法体中唯一一条语句是return返回语句,那么省略大括号的同时return也要省略(只省略return,不省略整个return语句)

    实例代码如下:

public class Lambda2 {public static void main(String[] args) {//无参数()括号不能省略If1 if1 = ()->{System.out.println("无参无返回值");};//调用方法if1.test();//单个参数,参数类型和()括号可以省略//方法体内单个语句{}大括号可以省略If2 if2 = a-> System.out.println("单个参数无返回值:a = " + a);if2.test(2);If3 if3 = (a, b)-> System.out.println("两个参数无返回值:a + b = " + (a + b));if3.test(1, 2);//省略return和{}大括号If4 if4 = ()->4;System.out.println("无参有返回值,返回值为:" + if4.test());If5 if5 = a->a;System.out.println("有参有返回值,返回值为:a = " + if5.test(5));}//无参无返回值interface If1 {void test();}//单个参数无返回值interface If2{void test(int a);}//两个参数无返回值interface If3{void test(int a, int b);}//无参有返回值interface If4{int test();}//有参有返回值interface If5{int test(int a);}
}

运行结果如下:

在这里插入图片描述

4.方法引用

有时候多个lambda表达式实现的函数是一样的话,可以封装成通用方法,以便于维护;

这个时候可以用方法引用实现:

语法是:对象::方法

假如是static静态方法,可以直接 类名::方法

4.1非静态方法的方法引用

示例代码如下:

public class Lambda3 {public static void main(String[] args) {If if1 = a -> a-2;System.out.println("if1的返回值为: " + if1.test(3));If if2 = a -> a-2;System.out.println("if2的返回值为: " + if2.test(4));}//单个参数有返回值interface If{int test(int a);}
}

可以看到两个对象调用的是同一种方法,所以可以使用方法引用来替代,代码如下:

public class Lambda3 {public static void main(String[] args) {
//        If if1 = a -> a-2;
//        System.out.println("if1的返回值为: " + if1.test(3));
//
//        If if2 = a -> a-2;
//        System.out.println("if2的返回值为: " + if2.test(4));//创建对象Lambda3 lambda3 = new Lambda3();//利用lambda表达式引用方法If if1 = lambda3::testA;System.out.println("if1的返回值为: " + if1.test(3));If if2 = lambda3::testA;System.out.println("if2的返回值为: " + if2.test(4));}public int testA(int a) {return a-2;}//单个参数有返回值interface If{int test(int a);}
}

实际上testA实现的也是接口If中的方法。

4.2静态方法的方法引用

直接使用 类名::方法

public class Lambda4 {public static void main(String[] args) {//利用lambda表达式引用方法If if1 = Lambda4::testA;System.out.println("if1的返回值为: " + if1.test(3));If if2 = Lambda4::testA;System.out.println("if2的返回值为: " + if2.test(4));}//静态方法public static int testA(int a) {return a-2;}//单个参数有返回值interface If{int test(int a);}
}

5.构造方法引用

如果函数式接口的实现恰好可以通过调用一个类的构造方法来实现,那么就可以使用构造方法引用。

语法: 类名::new

实例代码如下:

首先定义一个Dog类:

public class Dog {private String name;private int age;//无参构造方法public Dog(){}//有参构造方法public Dog(String name, int age) {this.name = name;this.age = age;}public String getName() {return this.name;}public int getAge() {return this.age;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}
//重写toString方法public String toString() {return "Dog{" + "name='" + name + '\'' +", age=" + age + '}';}
}

然后测试构造方法引用:

public class Lambda5 {public static void main(String[] args) {
//        //传统方法
//        //无参
//        DogService1 dog1 = () -> {
//          return new Dog();
//        };
//        System.out.println(dog1.getDog());
//        //简化版本
//        DogService1 dog1 = () -> new Dog();
//        System.out.println(dog1.getDog());//构造方法引用//无参DogService1 dog1 = Dog::new;System.out.println(dog1.getDog());//有参DogService2 dog2 = Dog::new;System.out.println(dog2.getDog("小汪", 1));}interface DogService1{Dog getDog();   //无参}interface DogService2{Dog getDog(String name, int age);   //有参}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/185177.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我的创作纪念日--成为创作者的 第1825天(5年) 啦

醉颜凉 ,不知不觉今天已经是你成为创作者的 第1825天(5年) 啦。 机缘 1、作为一个创作者,我最初成为创作者的初心是出于对技术的热爱和对分享的渴望。我希望通过创作,将自己在实战项目中的经验分享给大家,…

ECONGU4280 Corporate Finance

ECONGU4280 Corporate Finance WeChat: zh6-86

P8649 [蓝桥杯 2017 省 B] k 倍区间(前缀和+优化(桶分类))

分析: (1)任意连续子序列可用两个前缀和的差来表示 (2)判断该子序列是否为k的倍数 p1-p2 模 0 (mod k) 等价于:前缀和模 k 是否同余 (3)同余的任意两前缀和组合的序列均满足…

WEB安全之Python

WEB安全之python python-pyc反编译 python类似java一样,存在编译过程,先将源码文件*.py编译成 *.pyc文件,然后通过python解释器执行 生成pyc文件 创建一个py文件随便输入几句代码(1.py) 通过python交互终端 >>>import py_compil…

CISO在2024年应该优先考虑七项安全任务

专业安全媒体CyberTalk.org主编Shira Landau日前表示:现代企业的CISO们在2024年必须做出改变,要更多关注于企业整体安全路线图的推进与实现,让网络安全工作与业务发展目标保持更紧密的一致性。 首席信息安全官(CISO)是…

采购业务中的组织概述

目录 一、采购和库存管理中组织单位的概览二、企业的组织结构三、采购中组织结构3.1采购组织3.2采购组 一、采购和库存管理中组织单位的概览 1、 客户端:在SAP ERP系统中,客户端通过三位数字定义,并代表这独立的数据记录和独立的业务流程。客…

JavaScript WebApi 一(详讲)

基础知识在前面的部分已经讲过了,大家如果没有学习过JavaScript的可以去看一下 1.DOM 引入 在JavaScript中,DOM(文档对象模型)提供了一种表示和操作HTML文档的方式。在DOM中,文档被表示为一个由节点组成的树形结构。…

nodejs最新电商jd m端h5st 4.2签名算法4.2版本逆向,jd API接口,jd商品数据采集

前言: jd m端使用最新的h5st 4.2签名算法,与h5st 4.1版本有很大的不同。在这儿分析一下,供大家参考。 一、目标地址(Base64解码) aHR0cHM6Ly9zby5tLmpkLmNvbS93YXJlL3NlYXJjaC5hY3Rpb24/a2V5d29yZD0lRTklOTklQTQlRTYlQjklQkYlRTYlOUMlQkEmc2…

java编程:给定⼀组正整数数组M,找出M数组中N项和为给定数S。如果有多对N项数字的和都等于 S,则输出N个数的乘积最⼩的哪⼀项,没有则返回空

题目: 编程题:给定⼀组正整数数组M,找出M数组中N项和为给定数S。如果有多对N项数字的和都等于 S,则输出N个数的乘积最⼩的哪⼀项,没有则返回空; 程序如下: 测试主程序: 先看下测试示…

Linux系统centos7防火墙firewall开放IP及端口命令

CentOS7使用的是firewall防火墙,不再是原来的iptables 防火墙基础命令 1:查看firewall防火墙状态 firewall-cmd --state //或 systemctl status firewalld2:打开防火墙 systemctl start firewalld3:关闭防火墙 systemctl sto…

如何利用CHAT 进行扩写?

问CHAT:开发利用这些矿产资源的同时,我们也不能忽视环境保护的重要性。要以科学、合理、绿色环保的原则为指导,保护好帕米尔高原的生态环境,实现其可持续发展,以取得全局上的真正利益,按照以上文字进行简单…

esp32-s3部署yolox_nano进行目标检测

ESP32-S3部署yolox_nano进行目标检测 一、生成模型部署项目01 环境02 配置TVM包03 模型量化3.1预处理3.2 量化 04 生成项目 二、烧录程序 手上的是ESP32-S3-WROOM-1 N8R8芯片,整个链路跑通了,但是识别速度太慢了,20秒一张图,所以暂…

3D数字孪生场景编辑器

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 数字孪生的强大功能来自于将真实世界的资产与真实世界的数据联系起来,因此您可以…

C# WPF上位机开发(开篇)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 之前很少用到c#语言,大部分时间都用c/c,主要是它可以兼顾上位机qt开发以及嵌入式开发。所以,用c/c是比较合理的…

Vue3-路由

VueRouter4路由语法解析 1.创建路由实例由createRouter实现 2.路由模式 1)history模式使用createWebHistory():地址栏不带# 2)hash模式使用createWebHashHistory():地址栏带# 3)参数是基础路径,默认/ …

latex中算法的几种模板

latex中算法的几种模板_latex算法模板-CSDN博客文章浏览阅读6.2k次,点赞3次,收藏45次。latex中几种算法模板_latex算法模板https://blog.csdn.net/weixin_50514171/article/details/125136121?spm1001.2014.3001.5506

【JavaEE】多线程 (2) --线程安全

目录 1. 观察线程不安全 2. 线程安全的概念 3. 线程不安全的原因 4. 解决之前的线程不安全问题 5. synchronized 关键字 - 监视器锁 monitor lock 5.1 synchronized 的特性 5.2 synchronized 使⽤⽰例 1. 观察线程不安全 package thread; public class ThreadDemo19 {p…

无公网IP下,如何实现公网远程访问MongoDB文件数据库

文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 前言 MongoDB是一个基于分布式文件存储的数…

抖音本地生活服务商申请条件

抖音的本地生活服务商目前有两种,一种是可以做全国的服务商,我们一般叫抖音本地生活服务商,一种是区域优待服务商,也就是后面出来的服务商,这两种服务商的申请方式大同小异。 相同的地方就是都需要给平台交保证金。抖…

网站监控有什么作用?

科技改变生活,科技的发展让我们的生活越来越精彩丰富,数据中心机房监控系统也可以称为“自我监控系统”,主要是针对机房所有的设备及环境进行集中监控和管理的,其监控对象构成机房的各个子系统:动力系统、环境系统、消…