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元才…...
OpenClaw多模型切换:Qwen3-32B与其他镜像的混合调度方案
OpenClaw多模型切换:Qwen3-32B与其他镜像的混合调度方案 1. 为什么需要多模型切换? 去年冬天,当我第一次尝试用OpenClaw自动化处理技术文档时,遇到了一个尴尬的问题:用同一个模型处理代码生成和内容润色,…...
背栓干挂石材幕墙方式之我见
背栓干挂石材幕墙方式之我见干挂石材幕墙的方法有多种,目前国内常见的有短槽式、背栓式、背槽式等。下面就几种方式发表点自己的浅见,希望能对大家有帮助。1、短槽式(T型件或蝴蝶件):该方式是在石材上下面开槽…...
告别手动备份!用Power Automate Desktop自动备份桌面重要文件并生成日志
告别手动备份!用Power Automate Desktop打造智能文件备份系统 每天下班前,你是否会习惯性地将桌面上的重要文件拖拽到U盘或移动硬盘?这种重复性操作不仅耗时耗力,还容易因疏忽导致文件遗漏。更糟糕的是,当系统崩溃或误…...
Alpamayo-R1-10B参数调优教程:Temperature从0.4→1.2对轨迹激进程度的影响可视化对比
Alpamayo-R1-10B参数调优教程:Temperature从0.4→1.2对轨迹激进程度的影响可视化对比 1. 引言 如果你正在使用Alpamayo-R1-10B这个自动驾驶模型,可能会发现一个有趣的现象:同样的路口场景,同样的驾驶指令,模型给出的…...
Windows系统下CUDA Toolkit与cuDNN的安装与配置全攻略
1. 环境准备:确认你的硬件和系统支持 在开始安装CUDA Toolkit和cuDNN之前,首先要确认你的Windows系统是否满足基本要求。我遇到过不少朋友兴冲冲下载安装包,结果发现显卡根本不支持CUDA加速,白白浪费了时间。这里分享几个快速检查…...
保姆级教程:在绿联NAS的Docker里部署PaddleOCR,打造本地私有化文字识别服务
绿联NASDockerPaddleOCR:三步构建家庭级隐私文字识别中心 想象一下这样的场景:周末整理书房时,你翻出一叠泛黄的老照片和手写笔记,想将它们数字化保存却又担心上传到云端OCR服务会泄露家庭隐私;或是收到一份重要合同需…...
百川2-13B-4bits极限测试:OpenClaw连续72小时压力运行报告
百川2-13B-4bits极限测试:OpenClaw连续72小时压力运行报告 1. 为什么要做这次压力测试 去年冬天第一次接触OpenClaw时,我就被它"本地化AI智能体"的定位吸引。但真正让我产生深度测试想法的,是上个月处理客户数据时遭遇的尴尬——…...
17.在 React 中如何根据条件决定渲染哪个组件?
在 React 里,组件不是一上来就“全给你渲染出来”的。 很多时候,我们希望:界面要看情况说话——登录了看“欢迎回来”没登录就看“请先登录”加载中只给你个转圈圈请求失败再丢个错误提示这些“根据条件,决定渲染什么”的行为&…...
老旧电脑焕新生:OpenClaw+Qwen3-4B低资源占用优化方案
老旧电脑焕新生:OpenClawQwen3-4B低资源占用优化方案 1. 为什么需要低资源优化方案 去年我翻出一台2015款的MacBook Air,4GB内存的配置在当下连开几个Chrome标签页都吃力。但作为技术爱好者,我总想让它发挥余热。当我尝试在这台设备上运行O…...
c.语言完美演绎6-22
/* 范例:6-22 */ #include<stdio.h>#include<conio.h>int main(){char a;printf("你要进入本系统吗?是请按y,否请按任意键>");scanf("%c",&a);while(ay){int swn ;printf("(1)--nn乘法\n(2)--计算总数\n(3…...
