Java8 新特性 之 lambda 表达 和 函数式接口
—— lambda 表达式
概念
- lambda 表达式是一个匿名函数,可以把 lambda 表达式理解为是一段可以传递的代码。
 - 更简洁、更灵活,使 Java 的语言表达能力得到了提升
 - lambda 表达式是作为接口的实现类的对象(万事万物皆对象)
 
使用语法
- 例:
(o1,o2) -> Integer.compare(o1,o2) - ->:lambda 操作符 或 箭头操作符
 - -> 的左边:lambda 形参列表,对应着要重写的接口的抽象方法的形参列表
 - -> 的右边:lambda 体,对应着接口的实现类要重写的方法的方法体
 
语法格式
- 无参,无返回值
 
        new Thread(() -> {System.out.println("hello");}).start();
 
- 有一个参数,无返回值
 
        Consumer<Integer> a = (Integer integer) -> {System.out.println(integer);};
 
- 数据类型可以省略
 
        Consumer<Integer> a = (integer) -> {System.out.println(integer);};
 
- 只需要一个参数时,参数小括号可以省略
 
        Consumer<Integer> a = integer -> {System.out.println(integer);};
 
- 需要两个及以上的参数,并且有返回值
 
        Comparator<Integer> comparator = (o1, o2) -> {return o1 - o2;};
 
- 当只有一条语句时,return 和 大括号都有,则都可以省略
 
		Comparator<Integer> comparator = (o1, o2) -> o1 - o2;
 
—— 函数式接口
概念
- 如果接口中只声明有一个抽象方法,则此接口就称为函数式接口
 - 只有给函数式接口提供实现了类的对象时,才可以使用 lambda 表达式
 - 注解:
@FunctionalInterfaceJava8 后引入 - 包路径:java.util.function
 
四大核心函数式接口

—— 方法引用 / 构造器引用
概念
- 方法引用可以看做是基于 lambda 表达式的进一步刻画
 - 当需要提供一个函数式接口的实例时,我们可以使用 lambda 表达式提供此实例 
- 满足一定条件的情况下,可以使用方法引用 或 构造器引用替换 lambda 表达式
 
 - 方法引用作为了函数式接口的实例
 
使用语法
- 格式:
类(或者对象):: 方法名 - 举例:
Integer :: compare 
Lists.newArrayList("a", "b", "c").forEach(System.out::println)
 
构造器引用
// 无参构造器
Supplier<User> userSupplier = User::new;// 有参构造器
Function<Integer, User> userFunction = User::new; 
—— Stream 流式计算
概念
- Stream 是数据渠道,用于操作数据源(集合、数组)所生成的元素序列
 - Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤、和数据映射等操作
 - 使用 Stream API 对集合数据进行操作,类似于使用 SQL 执行的数据库查询
 
Stream 和 Collection 区别
- Collection 是一种静态的内存数据结构,讲的是数据;而 Stream 是计算。前者面向内存,存储在内存中;后者面向 CPU,通过 CPU 实现计算
 - Stream 不会自己存储元素、不会改变源对象
 - Stream 操作是延迟执行。这意味着他们会等到需要结果的时候才执行。即一旦执行终止操作,这就执行中间操作链,并产生结果
 - Stream 一旦执行了终止操作,就不能再调用其他中间操作或终止操作了
 
操作

		PersonBo personBo1 = new PersonBo(1, "张三");PersonBo personBo2 = new PersonBo(2, "李四");PersonBo personBo3 = new PersonBo(3, "王五");PersonBo personBo4 = new PersonBo(4, "赵六");List<PersonBo> list = new ArrayList<>();list.add(personBo1);list.add(personBo2);list.add(personBo3);list.add(personBo4);// filter 过滤(返回还是对象)list.stream().filter(t -> {return t.getId() % 2 == 0;}).forEach(System.out::println);// match:anyMatch、allMatch、noneMatch 对流中的元素进行匹配boolean y = list.stream().anyMatch(personBo -> {return personBo.getName().contains("y");});// map 将集合中的元素类型,转换成另一种数据类型list.stream().map(PersonBo::getId).forEach(System.out::println);// sorted 根据字段属性进行排序list.stream().sorted((u1, u2) -> {return u2.getId().compareTo(u1.getId());}).map(PersonBo::getId).forEach(System.out::println);// limit限制数————collect将map单个映射转为list集合list.stream().map(t -> {return t.getId();}).limit(1).forEach(System.out::println);// distinct 对流中的元素进行去重list.stream().distinct().forEach(System.out::println);// partitioningBy 根据判断的值为true还是false分为两组Map<Boolean, List<PersonBo>> collect = list.stream().collect(Collectors.partitioningBy(personBo -> {return personBo.getId() > 3;}));// groupingBy 将数据分组成多个key的形式(即groupby分组)Map<Integer, List<PersonBo>> collect1 = list.stream().collect(Collectors.groupingBy(PersonBo::getId));// reduce 计算集合总数Integer sum = list.stream().map(PersonBo::getId).reduce(Integer::sum).get();System.out.println(sum);相关文章:
Java8 新特性 之 lambda 表达 和 函数式接口
—— lambda 表达式 概念 lambda 表达式是一个匿名函数,可以把 lambda 表达式理解为是一段可以传递的代码。更简洁、更灵活,使 Java 的语言表达能力得到了提升lambda 表达式是作为接口的实现类的对象(万事万物皆对象) 使用语法…...
Netty服务端和客户端开发实例
一、Netty服务端开发在开始使用 Netty 开发 TimeServer 之前,先回顾一下使用 NIO 进行服务端开发的步骤。(1)创建ServerSocketChannel,配置它为非阻塞模式;(2)绑定监听,配置TCP 参数,例如 backlog 大小;(3)创建一个独立的I/O线程&…...
linux基本指令和权限
目录 一.shell命令以及运行原理 二.Linux常用指令 1. ls 指令 2. pwd命令 3.cd指令 4. touch指令 5.mkdir指令(重要) 6.rmdir指令 && rm 指令(重要) 7.man指令(重要) 8.cp指令(重要&…...
滚蛋吧,正则表达式!
大家好,我是良许。 不知道大家有没有被正则表达式支配过的恐惧?看着一行火星文一样的表达式,虽然每一个字符都认识,但放在一起直接就让人蒙圈了~ 你是不是也有这样的操作,比如你需要使用「电子邮箱正则表达式」&…...
序列号和反序列化--java--Serializable接口--json序列化普通使用
序列化和反序列化序列化和反序列化作用为什么需要用途Serializable使用serialVersionUID不设置的后果什么时候修改Externalizable序列化的顺序json序列化序列化和反序列化 序列化:把对象转换为字节序列的过程称为对象的序列化。 反序列化:把字节序列恢复为对象的过…...
Java异步任务编排
多线程创建的五种方式: 继承Thread类实现runnable接口。实现Callable接口 FutureTask(可以拿到返回结果,阻塞式等待。)线程池创建。 ExcutorService service Excutors.newFixedThreadPool(10); service.excute(new Runnable01());另外一种创建线程池…...
Hive与HBase的区别及应用场景
当数据量达到一定量级的时候,存储和统计计算查询都会遇到问题,今天了解一下Hive和Hbase的区别和应用场景。 一、定义 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能&am…...
C++之单例模式
目录 1. 请设计一个类,只能在堆上创建对象 2. 请设计一个类,只能在栈上创建对象 3.请设计一个类,不能被拷贝 C98 C11 4. 请设计一个类,不能被继承 C98 C11 5. 请设计一个类,只能创建一个对象(单例模式) 设计…...
Redis十大类型——Set与Zset常见操作
Redis十大类型——Set与Zset常见操作Set命令操作简列基本操作展示删除移动剪切集合运算Zset基本操作简列添加展示反转按分数取值获取分数值删除分数操作下标操作如果我们对Java有所了解,相信大家很容易就明白Set,在Redis中也一样,Set的value值…...
车载雷达实战之Firmware内存优化
内存(Memory)是计算机中最重要的部件之一,计算机运时的程序以及数据都依赖它进行存储。内存主要分为随机存储器(RAM),只读存储器(ROM)以及高速缓存(Cache)。仅仅雷达的原…...
【剑指Offer】JZ14--剪绳子
剪绳子详解1.问题描述2.解题思路3.具体实现1.问题描述 2.解题思路 首先想到的思路:因为是求乘积的最大值,所以如果截取剩下的是1,那还是它本身就没有意义。从此出发,考虑绳子长度是2、3、4、5…通过穷举法来找规律。 值–》拆分–…...
raspberry pi播放音视频
文章目录目的QMediaPlayerGStreamerwhat is GStreamer体系框架优势omxplayerwhat is omxplayercommand Linekey bindings运行过程中错误ALSA目的 实现在树莓派下外接扬声器, 播放某段音频, 进行回音测试。 QMediaPlayer 首先我的安装是5.11版本。 优先…...
【电子学会】2022年12月图形化二级 -- 老鹰捉小鸡
老鹰捉小鸡 小鸡正在农场上玩耍,突然从远处飞来一只老鹰,小鸡要快速回到鸡舍中,躲避老鹰的抓捕。 1. 准备工作 (1)删除默认白色背景,添加背景Farm; (2)删除默认角色小…...
C++的双端队列
双端队列介绍1.双端队列知识需知2.大试牛刀1.双端队列知识需知 由于队列是一种先进先出(FIFO)的数据结构,因此无法直接从队列的底部删除元素。如果希望从队列的底部删除元素,可以考虑使用双端队列(deque)。…...
【独家】华为OD机试 - 拼接 URL(C 语言解题)
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明本期…...
为什么使用Junit单元测试?Junit的详解
Hi I’m Shendi 为什么使用Junit单元测试?Junit的详解 Junit简介 Junit是一个Java语言的单元测试框架。 单元测试是一个对单一实体(类或方法)的测试 JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression test…...
怎么学好嵌入式Linux系统和驱动
嵌入式专业是一门实践性非常强的学科,只有多动手,多实践,多编程,多调试,多看书,多思考才能真正掌握好嵌入式开发技术。 现在很多同学也意识到了学校培养模式和社会需求脱节问题,有一部分同学也先…...
Spring Aware总结
概述 Spring中Aware到底是什么意思? 我们在看Spring源码的时候,经常可以看到xxxAwarexxx的身影,通常我会很疑惑,Aware到底是什么意思呢? 比如图片中这些包含Aware关键字的类或者接口。 我对下面3个类或接口进行了解…...
【RocketMQ】源码详解:Broker端消息刷盘流程
消息刷盘 同步入口:org.apache.rocketmq.store.CommitLog.GroupCommitService 异步入口:org.apache.rocketmq.store.CommitLog.FlushRealTimeService 刷盘有同步和异步两种,在实例化Commitlog的时候,会根据配置创建不同的服务 p…...
编码器SIQ-02FVS3驱动
一.简介 此编码器可以是功能非常强大,可以检测左右转动,和按键按下,所以说这一个编码器可以抵三个按键,而且体积非常小,使用起来比三个按键要高大尚,而且驱动也简单。唯一不足的点就是价格有点小贵6-8元才…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
