java的lambda和stream流操作

Lambda 表达式 ≈ 匿名函数

(Lambda接口)函数式接口:传入Lambda表达作为函数式接口的参数

函数式接口 = 只能有一个抽象方法的接口
Lambda 表达式必须赋值给一个函数式接口,比如 Java 8 自带的:

接口名 作用
Function<T,R> 传入 T 类型,返回 R 类型
Consumer 传入 T 类型,无返回(只执行)
Supplier 不传参,返回 T 类型值
Predicate 传入 T 类型,返回布尔(true/false)
核心理解:
Lambda 表达式只能赋值或传入“函数式接口(Functional Interface)”类型的变量或参数。

所以当你在方法中想要传入一个 Lambda 表达式作为参数时,方法的参数类型必须是某个函数式接口类型,否则 编译器不知道这个函数的签名该怎么对照,就会报错。

🧪 例 1:使用 Function<T, R>
java
复制
编辑
public static String transform(String input, Function<String, String> transformer) {
return transformer.apply(input);
}

// 调用时传入 Lambda 表达式:
String result = transform(“java”, s -> s.toUpperCase());
System.out.println(result); // JAVA
🧪 例 2:使用 Predicate 做条件判断
public static boolean check(String str, Predicate condition) {
return condition.test(str);
}

boolean isLong = check(“hello”, s -> s.length() > 3);
🧪 例 3:使用 Consumer 执行操作
public static void greet(String name, Consumer greeter) {
greeter.accept(name);
}

greet(“Jack”, s -> System.out.println("Hello " + s));
🧪 例 4:使用 Supplier 获取值
public static String getRandom(Supplier supplier) {
return supplier.get();
}

String value = getRandom(() -> UUID.randomUUID().toString());

如果你不指定这些接口(也就是函数式接口),Lambda 就没法传入!
比如这会报错:
public void doSomething(Object handler) {
// …
}

doSomething(x -> x + 1); // ❌ 编译错误:Object 不是函数式接口

Stream流:Java 8 的 Stream API 是一个用于处理集合数据的强大工具,支持链式调用、函数式编程风格

List 是一个顺序的集合,其中的每个元素都只是一个值。在流式操作中,流传递的就是这些值。

在流中处理的是每一个对象按需处理,list(‘hai’,‘dong’)那么在流中传递处理的就是‘hai’和‘dong’

Map 是由键值对(key-value)组成的集合,需要转换为Set。这里的流传递的元素是每个 Map.Entry<K, V>(即每个键值对)。

ageMap.entrySet()
.stream()
.map(entry -> entry.getKey() + " is " + entry.getValue() + " years old.")
.forEach(System.out::println);

将集合转换为stream

.stream()

常用中间操作(Intermediate)

中间操作是链式调用的操作,它们不会立即执行,而是会“懒执行”直到遇到终结操作。

  1. .filter() — 过滤
    用于从 Stream 中筛选出符合条件的元素。filter() 方法接收一个 Predicate(一个返回 boolean 的函数)。

List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List result = numbers.stream()
.filter(x -> x > 3) // 只保留大于 3 的数字
.collect(Collectors.toList());
System.out.println(result); // 输出 [4, 5, 6]

  1. .map() — 转换
    用于将 Stream 中的每个元素转换为其他类型或做某种操作。map() 方法接收一个 Function(一个接受一个参数并返回一个结果的函数)。

List names = Arrays.asList(“Tom”, “Jerry”, “Spike”);
List nameLengths = names.stream()
.map(String::length) // 转换每个名字为它的长度
.collect(Collectors.toList());
System.out.println(nameLengths); // 输出 [3, 5, 5]

  1. .flatMap() — 打平嵌套结构
    如果元素是一个集合(比如 List 或 Set),你可以使用 flatMap 把它“打平”为一个单一的流。这个操作适用于“集合中有集合”的情况。

List<List> namesList = Arrays.asList(
Arrays.asList(“Tom”, “Jerry”),
Arrays.asList(“Spike”, “Tyke”)
);

List flattenedList = namesList.stream()
.flatMap(List::stream) // 把 List 变成一个单一的 Stream
.collect(Collectors.toList());

System.out.println(flattenedList); // 输出 [Tom, Jerry, Spike, Tyke]

  1. .sorted() — 排序
    sorted() 用于对流中的元素进行排序。它可以使用默认排序或自定义排序(通过传入一个 Comparator)。

List numbers = Arrays.asList(5, 3, 8, 1, 7);
List sortedNumbers = numbers.stream()
.sorted() // 默认升序排序
.collect(Collectors.toList());
System.out.println(sortedNumbers); // 输出 [1, 3, 5, 7, 8]
自定义排序:

List names = Arrays.asList(“Tom”, “Jerry”, “Spike”);
List sortedNames = names.stream()
.sorted((a, b) -> b.compareTo(a)) // 降序排序
.collect(Collectors.toList());
System.out.println(sortedNames); // 输出 [Spike, Tom, Jerry]

  1. .distinct() — 去重
    distinct() 用于去除重复元素。

List numbers = Arrays.asList(1, 2, 3, 2, 3, 4);
List distinctNumbers = numbers.stream()
.distinct() // 去除重复的元素
.collect(Collectors.toList());
System.out.println(distinctNumbers); // 输出 [1, 2, 3, 4]

  1. .limit(n) — 限制前 n 个
    limit(n) 用于限制 Stream 中的元素个数。

List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List limitedNumbers = numbers.stream()
.limit(3) // 只保留前 3 个元素
.collect(Collectors.toList());
System.out.println(limitedNumbers); // 输出 [1, 2, 3]

  1. .skip(n) — 跳过前 n 个
    skip(n) 用于跳过 Stream 中的前 n 个元素。

List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List skippedNumbers = numbers.stream()
.skip(3) // 跳过前 3 个元素
.collect(Collectors.toList());
System.out.println(skippedNumbers); // 输出 [4, 5, 6]

常用终结操作(Terminal)

终结操作会触发流的计算并最终返回一个结果,或者是将流的内容收集到一个集合中。终结操作执行时会迫使 Stream 中的中间操作开始工作。

  1. .collect() — 收集(成 List、Set、Map 等)
    collect() 是一个常用的终结操作,它用于将流的元素收集到一个集合或其他容器中。

List numbers = Arrays.asList(1, 2, 3, 4, 5);
List result = numbers.stream()
.filter(x -> x > 3)
.collect(Collectors.toList()); // 收集成一个 List
System.out.println(result); // 输出 [4, 5]

  1. .forEach() — 遍历
    forEach() 用于遍历流中的每个元素,并对每个元素执行给定的操作。它接收一个 Consumer 类型的参数。

List names = Arrays.asList(“Tom”, “Jerry”, “Spike”);
names.stream()
.forEach(System.out::println); // 打印每个名字

  1. .count() — 计数
    count() 用于返回流中的元素数量。

List numbers = Arrays.asList(1, 2, 3, 4, 5);
long count = numbers.stream()
.filter(x -> x > 3)
.count(); // 返回大于 3 的元素数量
System.out.println(count); // 输出 2

  1. .reduce() — 规约(合并结果)
    reduce() 是一个强大的终结操作,可以用来将流中的元素“规约”成一个单一的结果,通常用于求和、求积等操作。

List numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.reduce(0, (a, b) -> a + b); // 求和,初始值是 0
System.out.println(sum); // 输出 15

  1. .anyMatch() — 是否有任意满足条件的元素
    anyMatch() 用于检查流中是否有至少一个元素符合给定条件,返回一个 boolean 值。

List numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean result = numbers.stream()
.anyMatch(x -> x > 4); // 判断是否有元素大于 4
System.out.println(result); // 输出 true

  1. .allMatch() — 是否所有元素都满足条件
    allMatch() 用于检查流中的所有元素是否都符合给定的条件,返回一个 boolean 值。

List numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean result = numbers.stream()
.allMatch(x -> x > 0); // 判断是否所有元素都大于 0
System.out.println(result); // 输出 true

  1. .findFirst() — 返回第一个元素(Optional)
    findFirst() 返回流中的第一个元素。它返回一个 Optional,可以避免空指针异常。

List names = Arrays.asList(“Tom”, “Jerry”, “Spike”);
String firstName = names.stream()
.findFirst()
.orElse(“No Name”); // 如果流为空,返回 “No Name”
System.out.println(firstName); // 输出 Tom

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

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

相关文章

Dify智能体平台源码二次开发笔记(6) - 优化知识库pdf文档的识别

目录 前言 新增PdfNewExtractor类 替换ExtractProcessor类 最终结果 前言 dify的1.1.3版本知识库pdf解析实现使用pypdfium2提取文本&#xff0c;主要存在以下问题&#xff1a; 1. 文本提取能力有限&#xff0c;对表格和图片支持不足 2. 缺乏专门的中文处理优化 3. 没有文档结…

easyExcel单元格合并

环境 java 1.8 easyexcel 3.1.1 实现方式 自定义WriteHandler&#xff0c;实现AbstractMergeStrategy抽象类&#xff0c;实现merge 方法完成自定义的合并操作。 本测试代码&#xff0c;实现了eques方法&#xff0c;用于判断是否需要合并 核心代码 实现AbstractMergeStrate…

Jenkins 简易使用记录

一、Jenkins 核心功能与适用场景 核心功能&#xff1a; 持续集成&#xff08;CI&#xff09;&#xff1a;自动构建代码、运行单元测试。持续交付&#xff08;CD&#xff09;&#xff1a;自动化部署到测试/生产环境。任务调度&#xff1a;定时执行任务&#xff08;如备份、清理&…

【HFP】蓝牙HFP协议音频连接核心技术深度解析

目录 一、音频连接建立的总体要求 1.1 发起主体与时机 1.2 前提条件 1.3 同步连接的建立 1.4 通知机制 二、不同主体发起的音频连接建立流程 2.1 连接建立触发矩阵 2.2 AG 发起的音频连接建立 2.3 HF 发起的音频连接建立 三、编解码器连接建立流程 3.1 发起条件 3.…

【卡洛诗】成为平价市场中的标杆西餐厅

近年来&#xff0c;中国餐饮市场在消费分级趋势下面临结构性调整&#xff0c;消费者对“质价比”的追求催生了新赛道的崛起。在这一背景下&#xff0c;卡洛诗西餐凭借精准的定位与系统性创新&#xff0c;以“中式西餐”为核心理念&#xff0c;成功打破西餐高价壁垒&#xff0c;…

嵌入式设备网络的动态ID分配机制实现

文章目录 前言一、系统设计要点二、核心数据结构2.1 设备唯一标识(DeviceUID)2.2 节点信息(Node)2.3 节点管理器(NodeManager) 三、核心算法实现3.1 初始化与清理3.1.1 初始化节点管理器3.1.2 清理节点管理器 3.2 动态ID分配策略3.2.1 查找最小可用ID3.2.2 ID使用检查 3.3 心跳…

WebSocket 双向通信技术详解

引言 在现代Web应用中&#xff0c;实时通信已经成为不可或缺的一部分。想象一下聊天应用、在线游戏、股票交易平台或协作工具&#xff0c;这些应用都需要服务器能够即时将更新推送给客户端&#xff0c;而不仅仅是等待客户端请求。WebSocket技术应运而生&#xff0c;它提供了一…

kafka菜鸟教程

一、kafka原理 1、kafka是一个高性能的消息队列系统&#xff0c;能够处理大规模的数据流&#xff0c;并提供低延迟的数据传输&#xff0c;它能够以每秒数十万条消息的速度进行读写操作。 二、kafka优点 1、服务解耦 &#xff08;1&#xff09;提高系统的可维护性‌ 通过服务…

SQLMap工具使用

一、SQLMap介绍 SQLMap 是一款强大的开源自动化 SQL 注入工具&#xff0c;用于检测和利用 Web 应用程序中的 SQL 注入漏洞。其工作原理是SQLMap 通过向目标 URL 发送带有特殊构造的 SQL 语句的请求&#xff0c;观察目标应用程序的响应&#xff0c;来判断是否存在 SQL 注入漏洞…

virtualbox安装xp系统卡顿的解决

安装virtualbox的增强功能即可。 先去下载 — Oracle VirtualBox下载 VirtualBox Guest Additions iso镜像 然后在这里导入iso镜像 再按照这几步操作 virtualbox按键 强制关闭xp-cuckoo的虚拟机 VBoxManage controlvm "xp-cuckoo" poweroff

观察者 ➜ 事件总线:一路走来的碎碎念

写给未来的自己:每次手敲事件模型都要 Google,干脆把思路和踩坑一次性记清楚。文章很长,都是唠叨,目的是让自己看两眼就能把设计理由找回来。 目录 为什么我要折腾事件模型?V0 ─ 单一事件的观察者模式V1 ─ 多事件同步总线(类型拆分)V2 ─ 订阅者优先级(链式调用可控)…

windwos脚本 | 基于scrcpy,只投声音、只投画面

安装scrcpy&#xff0c;scrcpy自带adb 写脚本命名为 .bat 结尾 注意这里的set "PATHD:\tools\scrcpy-win64-v3.2;%PATH%" 替换成scrcpy的安装目录 echo off :: 设置UTF-8编码 chcp 65001 > nul :: 设置标题 title 手机投屏工具:: 添加 scrcpy 路径到 PATH set &q…

Android device PCO (protocol configuration options) intro

术语 英文缩写英文全称中文PCOprotocol configuration options协议配置选项RILradio interface layer 无线电接口层PCO介绍 PCO(Protocol Configuration Options) 是 3GPP 标准协议(TS 24.008)中定义的核心概念,用于在 LTE/5G 网络建立 PDN 连接时传递动态配置参数(如 D…

Spring Boot配置文件优先级全解析:如何优雅覆盖默认配置?

&#x1f4da; 一、为什么需要了解配置文件优先级&#xff1f; 想象一下&#xff0c;你正在玩一个游戏&#x1f3ae;&#xff0c;游戏里有默认设置&#xff0c;但你可以通过不同的方式修改这些设置&#xff1a; 游戏内置的默认设置&#xff08;就像Spring Boot的默认配置&…

汽车行驶工况特征参数:从“速度曲线”到“驾驶DNA”的硬核解码

作为新能源汽车行业的从业者&#xff0c;你是否曾困惑于这些问题&#xff1a; 为什么同一款电动车&#xff0c;不同用户的实际续航差异高达30%&#xff1f;如何精准量化驾驶行为对电池寿命的影响&#xff1f;车企标定的“NEDC续航”与真实路况差距的根源是什么&#xff1f; 这…

HTTP 2.0 协议特性详解

1. 使用二进制协议&#xff0c;简化传输的复杂性&#xff0c;提高了效率 2. 支持一个 TCP 链接发起多请求&#xff0c;移除 pipeline HTTP/2 移除了 HTTP/1.1中的管道化&#xff08;pipeline&#xff09;机制&#xff0c;转而采用多路复用&#xff08;Multiplexing&#xff0…

完美解决浏览器不能复制的问题(比如赛氪网的中题库练习题)

仅供复制题库题目进行打印学习使用&#xff01; 最近想把赛氪网题库中的题目打印出来做练习&#xff0c;发现题库中的题目不能复制&#xff0c;不能在试卷上勾画标记太难受了&#xff0c;而且不能留作材料以后复习&#xff0c;故出此策。 而且CtrlP打印出的pdf会缺少题目。(我…

std::set (C++)

std::set 1. 概述定义特点 2. 内部实现3. 性能特征4. 常用 API5. 使用示例6. 自定义比较器7. 注意事项与优化8. 使用建议 1. 概述 定义 template<class Key,class Compare std::less<Key>,class Allocator std::allocator<Key> > class std::set;特点 有…

SSM省市区三级联动和三表联查附带数据库

SSM省市区三级联动和三表联查 ------附带数据库码云地址&#xff1a;https://gitee.com/Mr_ZKC/NO1 数据库在项目中

曲棍球·棒球1号位

中国女子曲棍球队曾涌现过马弋博、李红侠等优秀选手&#xff0c;但“李红”这一名字可能为信息误差。以下为您系统介绍曲棍球&#xff0c;并结合棒球进行对比分析&#xff1a; 曲棍球&#xff08;Hockey&#xff09;核心特点 运动形式 分为草地曲棍球&#xff08;夏季奥运会项…