23.Lambda表达式

news2024/11/17 16:13:15

Lambda表达式

一、Lambda表达式背景

Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。

二、Lambda表达式基本语法

()->{}

在这里插入图片描述

Lambda表达式由三部分组成:

  • 参数:类似方法中的形参列表,这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明,也可不声明而由JVM隐含的推断。另外当只有一个参数时可以省略掉圆括号。
  • ->:可理解为“应用于”的意思
  • 方法体:可以是表达式也可以代码块,是函数式接口里方法的实现。代码块可返回一个值或者什么都不反
    回,这里的代码块块等同于方法的方法体。如果是表达式,也可以返回一个值或者什么都不反回。

三、Lambda函数式接口

要想了解什么是Lambda表达式,首先要了解什么是函数式接口。所谓函数式接口:
首先:接口中只能有一个抽象方法,那么这个接口就是函数式接口
其次:可以在接口中使用@FunctionalInterface注解,使编译器按照函数是接口进行要求,如果在接口中存在多个抽象方法,编译器就会提示。
第三:如果你可以保证你的接口中确实只有一个方法,那么编译器就会默认为函数式接口,不会因@FunctionalInterface注解而定。

@FunctionalInterface
public interface IFuncationInterface {
	//注意:只能有一个方法存在,如果不加入@FunctionalInterface,编译器会根据情况而定
	public void say();
}

public static void main(String[] args) {
	//声明接口对象,通过Lambda表达式实现方法
	IFuncationInterface funcationInterface=()->{System.out.println("大家好,我是Lambda表达式");};
	//调用接口方法
	funcationInterface.say();
}

在这里插入图片描述

四、Lambda表达式使用

//无参数无返回值的方法
@FunctionalInterface
public interface IOneInterface {
	public void say();
}
//无参数有返回值的方法
public interface ITwoInterface{
	public String say();
}
//有参数有返回值的方法
public interface IThreeInterface {
	public String say(String name,int age);
}

public static void main(String[] args) {
		
	//无参数无返回值方法
	IOneInterface oneInterface=()->System.out.println("我是无返回值无参数方法");
	oneInterface.say();
		
	//无参数有返回值方法
	ITwoInterface twoInterface=()->"我是有返回值无参数方法,我只有一句话,所以我省略return";
	String str=twoInterface.say();
	System.out.println(str);
		
	//有参数有返回值方法
	IThreeInterface threeInterface=(name,age)->name+"今年"+age+"岁了,所以我是一个有参数有返回值的方法";
	String s=threeInterface.say("张三",18);
	System.out.println(s);
	}

在这里插入图片描述
使用Lambda时,要记住的就两点:

  • Lambda返回的是接口的实例对象
  • 有没有参数、参数有多少个、需不需要有返回值、返回值的类型是什么---->选择自己合适的函数式接口

五、Lambda表达式特点

  • 参数类型可以省略,如果需要省略,每个参数的类型都要省略。
  • 参数的小括号里面只有一个参数,那么小括号可以省略。
  • 如果方法体当中只有一句代码,那么大括号可以省略。
  • 如果方法体中只有一条语句,其是return语句,那么大括号可以省略,且去掉return关键字。

优点:
代码简洁,开发迅速
方便函数式编程
非常容易进行并行计算
Java 引入 Lambda,改善了集合操作
缺点:
代码可读性变差
在非并行计算中,很多计算未必有传统的 for 性能要高
不容易进行调试

总结:Lambda表达式能够帮助我们快速完成代码,使代码更简洁,更直观的去实现内容,同时也为我们阅读代码增加了一定的难度

六、Lambda表达式集合中的应用

实现List集合循环

List<String> strList=new ArrayList<String>();
strList.add("Hello");
strList.add("World");
strList.add("Hello");
strList.add("Java");
strList.add("World");
		
strList.forEach(str->System.out.println(str));

实现Set集合循环

Set<String> strList=new HashSet<String>();
strList.add("Hello");
strList.add("World");
strList.add("Hello");
strList.add("Java");
strList.add("World");
		
strList.forEach(str->System.out.println(str));

实现Map集合循环

Map<Integer,String> strList=new HashMap<Integer,String>();
strList.put(1,"Hello");
strList.put(2,"World");
strList.put(3,"Hello");
strList.put(4,"Java");
strList.put(5,"World");
		
strList.forEach((i,s)->System.out.println(i+"---"+s));

七、方法引用

在使用Lambda表达式时,我们有时会遇到这样的写法

List<String> strList=new ArrayList<String>();
strList.add("Hello");
strList.add("World");
strList.add("Hello");
strList.add("Java");
strList.add("World");
		
strList.forEach(str->System.out.println(str));
//这样写也可以实现?
strList.forEach(System.out::println);


答案是肯定的,这样写确实可以实现,这种形式,是Lambda表达式中更简洁的写法,方法的引用。

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

方法的引用包含

  • 引用普通方法
  • 引用静态方法
  • 引用构造方法
public class ImplementInterface{
	public static void say(String name) {
		System.out.println(name);
	}
	
	public void say1(String name) {
		System.out.println(name);
	}

	public ImplementInterface() {
		System.out.println("我是构造方法");
	}
}
public static void main(String[] args) {
		
	//通过类调用静态方法
	Consumer<String> consumer=ImplementInterface::say;
	consumer.accept("我是静态方法");

	//通过对象调用普通方法
	ImplementInterface implementInterface=new ImplementInterface();
	Consumer<String> consumer2=implementInterface::say1;
	consumer2.accept("我是普通方法");
		
	//通过类调用构造方法
	Supplier<ImplementInterface> supplier=ImplementInterface::new;
	System.out.println(supplier.get());
}

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

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

相关文章

2023-05-05 背包问题

背包问题 1 01背包和完全背包问题 01背包问题 有N件物品和一个容量为V的背包&#xff0c;第i件物品的体积是v[i]、价值是w[i]&#xff0c;每种物品只可以使用一次&#xff0c;求将哪些物品放入背包可以使得价值总和最大。这里的w是weight即权重的意思 这是最基础的背包问题&a…

【飞书ChatGPT机器人】飞书接入ChatGPT,打造智能问答助手

文章目录 前言环境列表视频教程1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 转载自远控源码文章&#xff1a;飞书接入ChatGPT - 将ChatGPT集…

Ubuntu 如何查看 CPU 架构、系统信息、内核版本、版本代号?

Ubuntu 查看 CPU 架构、系统信息、内核版本、版本代号等相关信息有很多方式&#xff0c;本文介绍几种常用的命令。 x86 架构与 ARM 架构的 CPU 架构不同&#xff0c;如果回显为 aarch64 表示为 ARM 架构&#xff0c;如果回显为 x86_64 表示为 x86 架构&#xff0c;参考《CPU 架…

Prometheus快速入门

Prometheus快速入门 环境准备 三台主机&#xff0c;配置好主机名 各自配置好主机名 # hostnamectl set-hostname --static server.cluster.com ... 三台都互相绑定IP与主机名 # vim /etc/hosts 192.168.126.143 server.cluster.com 192.168.126.142 agent.clu…

归并排序(看了就会)

目录 概念1. 基本思想2. 实现逻辑3. 复杂度分析4、代码 概念 归并排序&#xff0c;是创建在归并操作上的一种有效的排序算法。算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用&#xff0c;且各层分治递归可以同时进行。归并排序思路简单&…

智头条|欧盟达成《人工智能法》协议,全球前沿科技齐聚AWE 2023

行业动态 华为云联手多方推进数字化&#xff0c;软通动力深度参与 华为云宣布启动“‘百城万企’应用现代化中国行”&#xff0c;旨在推动应用现代化进程、助力数字中国高质量落地。软通动力是该行动的参与者之一&#xff0c;共同探索符合区域特点、产业趋势、政企现状的数字化…

Python进阶(Linux操作系统)

一&#xff0c;操作系统 1.1&#xff0c;Linux系统基础操作 1.2&#xff0c;linux进程与线程 1.2.1并发&#xff0c;并行 &#xff08;1&#xff09;并发&#xff1a;在一段时间内交替的执行多个任务&#xff1a;对于单核CPU处理多任务&#xff0c;操作系统轮流让让各个任务…

BasicVSR++代码解读(总体介绍)

本文代码主要来自于OpenMMLab提供的MMEditing开源工具箱中的BasicVSR代码。第一部分的解读主要是针对每一个部分是在做什么提供一个解释&#xff0c;便于后续细读每一个块的细节代码。 &#xff08;1&#xff09;导入库     basicvsr_plusplus_net中主要继承了torch,mmcv,m…

信号的产生——线性调频函数

信号的产生——线性调频函数 产生线性调频扫频信号函数chirp的调用格式如下&#xff1a; &#xff08;1&#xff09;y chirp(t,f0, t1,f1) 功能&#xff1a;产生一个线性&#xff08;频率随时间线性变化&#xff09;信号&#xff0c;其时间轴设置由数组t定义。时刻0的瞬间频…

SpringBoot的配置文件、日志文件

一、配置文件&#xff08; .properties、.yml&#xff09; 1、.properties 配置文件 1.1、格式 1.2、基本语法 1.2.1、如&#xff1a;一般配置&#xff08;以键值的形式配置的&#xff0c;key 和 value 之间是以“”连接的。&#xff09; 1.2.2、如&#xff1a;自定义配置&a…

tcc-transaction 源码分析

tcc介绍 tcc介绍查看我之前的文章&#xff1a; https://caicongyang.blog.csdn.net/article/details/119721282?spm1001.2014.3001.5502 tcc-transaction 介绍&#xff1a; http://mengyun.org/zh-cn/index.html 本文基于2.x 最新版本:https://github.com/changmingxie/tcc…

以京东为例,分析优惠价格叠加规则

一、平行优惠计算原则 1、什么是“平行式门槛计算规则”&#xff1f; 平行式门槛计算规则&#xff0c;即每一层级优惠都直接根据商品的单品基准价来计算是否符合门槛&#xff0c;店铺/平台促销、优惠券类优惠之间是并列关系&#xff0c;只要单品基准价或单品基准价总和&#x…

c++(类和对象中)

【本节目标】 1. 类的6个默认成员函数 2. 构造函数 3. 析构函数 4. 拷贝构造函数 5. 赋值运算符重载 6. const成员函数 7. 取地址及const取地址操作符重载 目录 1、类的6个默认成员函数 2、构造函数 2.1概念 2.2特性 3.析构函数 3.1概念 3.2特性 4.拷贝构造函数…

Kafka生产者

一、生产者发送流程 在消息发送的过程中&#xff0c;涉及到了两个线程——main 线程和 Sender 线程。在 main 线程中创建了一个双端队列 RecordAccumulator。main 线程将消息发送给 RecordAccumulator&#xff0c;Sender 线程不断从 RecordAccumulator 中拉取消息发送到 Kafka …

网络应用基础 ——(2023新星计划文章二)

一&#xff0c;TCP/UDP报头 1.1TCP报文头部详解 Source port:源端口号与Destination port目标端口号&#xff1a; 在TCP&#xff08;传输控制协议&#xff09;协议中&#xff0c;源端口和目标端口字段用于标识通信会话的端点。 &#xff08;1&#xff09;源端口是一个16位字段…

LeetCode 1206. 实现跳表

不使用任何库函数&#xff0c;设计一个跳表。 跳表是在 O(log(n)) 时间内完成增加、删除、搜索操作的数据结构。跳表相比于树堆与红黑树&#xff0c;其功能与性能相当&#xff0c;并且跳表的代码长度相较下更短&#xff0c;其设计思想与链表相似。 例如&#xff0c;一个跳表包…

3.数据查询(实验报告)

目录 一﹑实验目的 二﹑实验平台 三﹑实验内容和步骤 四﹑命令(代码)清单 五﹑调试和测试清单 一﹑实验目的 掌握使用Transact-SQL的SELECT语句进行基本查询的方法&#xff1b;掌握使用SELECT语句进行条件查询的方法&#xff1b;掌握SELECT语句的GROUP BY、ORDER BY以及UN…

MX6U根文件系统配置

编译 BusyBox 构建根文件系统 /home/ /linux/nfs mkdir rootfs tar -vxjf busybox-1.29.0.tar.bz2 依照自己的交叉编译 不然会出错 配置好 busybox 以后就可以编译了&#xff0c;我们可以指定编译结果的存放目录&#xff0c;我们肯定要将编 译结果存放到前面创建的 rootfs 目录…

(leetcode)66. 加一 67. 二进制求和(详解)

目录 66. 加一 思路 代码 67. 二进制求和 思路 代码 66. 加一 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这…

7个最好的WordPress LMS在线学习管理系统比较

您是否正在为您的 WordPress 网站寻找最好的 LMS 在线学习管理系统插件&#xff1f; 学习管理系统 (LMS) 插件允许您创建和运行类似 Udemy 和 LearnDesk 等在线课程。一个完美的 WordPress LMS 插件拥有您管理在线课程、运行和评分测验、接受付款等所需的一切。 在本文中&…