当前位置: 首页 > article >正文

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

相关文章:

java的lambda和stream流操作

Lambda 表达式 ≈ 匿名函数 &#xff08;Lambda接口&#xff09;函数式接口&#xff1a;传入Lambda表达作为函数式接口的参数 函数式接口 只能有一个抽象方法的接口 Lambda 表达式必须赋值给一个函数式接口&#xff0c;比如 Java 8 自带的&#xff1a; 接口名 作用 Functio…...

【嵌入式】【阿里云服务器】【树莓派】学习守护进程编程、gdb调试原理和内网穿透信息

目录 一. 守护进程的含义及编程实现的主要过程 1.1守护进程 1.2编程实现的主要过程 二、在树莓派中通过三种方式创建守护进程 2.1nohup命令创建 2.2fork()函数创建 2.3daemon()函数创建 三、在阿里云中通过三种方式创建守护进程 3.1nohup命令创建 3.2fork()函数创建 …...

数据结构学习笔记 :树与二叉树详解

目录 树的基本概念二叉树的定义与特性二叉树的存储结构 3.1 顺序存储 3.2 链式存储二叉树遍历特殊二叉树类型总结与应用场景 一、树的基本概念 核心定义 树&#xff1a;由根节点和若干子树构成的层次结构。叶子节点&#xff08;终端节点&#xff09;&#xff1a;没有子节点的…...

前沿篇|CAN XL 与 TSN 深度解读

引言 1. CAN XL 标准演进与设计目标 2. CAN XL 物理层与帧格式详解 3. 时间敏感网络 (TSN) 关键技术解析 4. CAN XL + TSN 在自动驾驶领域的典型应用...

七、LangChain Tool类参数对接机制解析:基于Pydantic的类型安全与流程实现

LangChain 的 Tool 类(包括 BaseTool 和 StructuredTool)通过 参数校验、输入解析、函数调用 的流程,将外部函数与 Agent 的逻辑对接。以下是其内部逻辑的详细解析: 1. 工具与函数对接的核心机制 (1) 工具的定义方式 LangChain 提供了两种主要方式定义工具: 继承 BaseTo…...

Spring-AI-alibaba 结构化输出

1、将模型响应转换为 ActorsFilms 对象实例&#xff1a; ActorsFilms package com.alibaba.cloud.ai.example.chat.openai.entity;import java.util.List;public record ActorsFilms(String actor, List<String> movies) { } GetMapping("/toBean")public Ac…...

AI大模型科普:从零开始理解AI的“超级大脑“,以及如何用好提示词?

大家好&#xff0c;小机又来分享AI了。 今天分享一些新奇的东西&#xff0c; 你有没有试过和ChatGPT聊天时&#xff0c;心里偷偷犯嘀咕&#xff1a;"这AI怎么跟真人一样对答如流&#xff1f;它真的会思考吗&#xff1f;" 或者刷到技术文章里满屏的"Token"…...

STM32单片机入门学习——第40节: [11-5] 硬件SPI读写W25Q64

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.18 STM32开发板学习——第一节&#xff1a; [1-1]课程简介第40节: [11-5] 硬件SPI读…...

【Java学习笔记】关键字汇总

Java 关键字汇总 用于定义数据类型的关键字&#xff1a; classinterfaceenumbyteshortintlongfloatdoublecharbooleanvoid 用于定义数据值的关键字&#xff1a; truefalsenull 用于定义流程控制的关键字&#xff1a; ifelseswitchcasedefaultwhiledoforbreakcontinueretu…...

langgraph框架之初识

1.什么是langgraph&#xff1f; LangGraph 是一个用于构建可控代理的底层编排框架。在AI中&#xff0c;代理也就是执行动作的智能体&#xff0c;也就是agent。使用这个框架可以构建一个可以自由控制的智能执行体&#xff0c;它可以帮我们做许多事情&#xff0c;如下&#xff1…...

如何将 .txt 文件转换成 .md 文件

一、因为有些软件上传文件的时候需要 .md 文件&#xff0c;首先在文件所在的目录中&#xff0c;点击“查看”&#xff0c;然后勾选上“文件扩展名”&#xff0c;这个时候该目录下的所有文件都会显示其文件类型了。 二、这时直接对目标的 .txt 文件进行重命名&#xff0c;把后缀…...

pdfjs库使用记录1

import React, { useEffect, useState, useRef } from react; import * as pdfjsLib from pdfjs-dist; // 设置 worker 路径 pdfjsLib.GlobalWorkerOptions.workerSrc /pdf.worker.min.js; const PDFViewer ({ url }) > { const [pdf, setPdf] useState(null); const […...

Qt 创建QWidget的界面库(DLL)

【1】新建一个qt库项目 【2】在项目目录图标上右击&#xff0c;选择Add New... 【3】选择模版&#xff1a;Qt->Qt设计师界面类&#xff0c;选择Widget&#xff0c;填写界面类的名称、.h .cpp .ui名称 【4】创建C调用接口&#xff08;默认是创建C调用接口&#xff09; #ifnd…...

Django REST framework 并结合 `mixin` 的示例

下面为你提供一个使用 Django REST framework 并结合 mixin 的示例,该示例将实现一个简单的图书管理 API。 项目需求 我们要创建一个图书管理系统的 API,支持对图书信息的创建、读取、更新和删除操作。 实现步骤 1. 项目初始化 首先,确保你已经安装了 Django 和 Django…...

linux查看及修改用户过期时间

修改用户有效期 密码到期时间 sudo chage -E 2025-12-31 username sudo chage -M 180 username sudo chage -d $(date %F) username 查询用户密码到期时间 for user in $(cat /etc/passwd |cut -d: -f1); do echo $user; chage -l $user | grep "Password expires"; …...

Vue.directive自定义v-指令

翻阅文章有感&#xff0c;记录学习 vue前端菜单权限控制_vue权限管理菜单思路-CSDN博客 一、定义&#xff1a;Vue.directive是Vue框架中给开发者用于注册自定义指令和返回已注册指令的API 二、基本语法&#xff1a; // 注册 Vue.directive(my-directive, {bind: function () …...

AI Agent 元年,于 2025 开启

私人博客传送门 AI Agent 元年&#xff0c;于 2025 开启 | 魔筝炼药师...

Django 自带开发服务器

$ python manage.py runserver $ python manage.py runserver 666 # 用 666 端口 $ python manage.py runserver 0.0.0.0:8000 # 让局域网内其他客户端也可访问 $ python manage.py runserver --skip-checks # 跳过检查自动检查 $ python manage.py runserver --…...

Spring 数据库编程

Spring JDBC 传统的JDBC在操作数据库时&#xff0c;需要先打开数据库连接&#xff0c;执行SQL语句&#xff0c;然后封装结果&#xff0c;最后关闭数据库连接等资源。频繁的数据库操作会产生大量的重复代码&#xff0c;造成代码冗余&#xff0c;Spring的JDBC模块负责数据库资源…...

进阶篇|CAN FD 与性能优化

引言 1. CAN vs. CAN FD 对比 2. CAN FD 帧结构详解...

CTF--各种绕过哟

一、原网页&#xff1a; 二、步骤&#xff1a; 1.源代码&#xff1a; <?php highlight_file(flag.php); $_GET[id] urldecode($_GET[id]); $flag flag{xxxxxxxxxxxxxxxxxx}; if (isset($_GET[uname]) and isset($_POST[passwd])) {if ($_GET[uname] $_POST[passwd])pr…...

【Pandas】pandas DataFrame where

Pandas2.2 DataFrame Indexing, iteration 方法描述DataFrame.head([n])用于返回 DataFrame 的前几行DataFrame.at快速访问和修改 DataFrame 中单个值的方法DataFrame.iat快速访问和修改 DataFrame 中单个值的方法DataFrame.loc用于基于标签&#xff08;行标签和列标签&#…...

嵌入式ARM RISCV toolchain工具 梳理arm-none-eabi-gcc

嵌入式TOOLchain工具 梳理 简介 本文总结和梳理一下一些toolchain的规则和原理&#xff0c;方便后续跨平台的时候&#xff0c;给大家使用toolchain做一个参考。 解释如何理解arm-none-eabi-gcc等含义&#xff0c;以及如何一看就知道该用什么编译器。 当然如果有哪里写的不是…...

OpenBMC:BmcWeb log输出

BmcWeb的log函数定义于:http\logging.hpp 说实话,个人觉得这一版的log函数有点炫技,使用起来也没有之前的版本方便,不过也还是值的参考一下。 1.如何输出log BMCWEB_LOG_ERROR("GetAll on path {} iface {} service {} failed with code {}",objectPath, inte…...

复现SCI图像增强(Toward fast, flexible, and robust low-light image enhancement.)

运行train.py报错 > File "/home/uriky/桌面/SCI-main/SCI-main/train.py", line 105, in main > train_queue torch.utils.data.DataLoader( File "/home/uriky/anaconda3/envs/AA/lib/python3.8/site-packages/torch/utils/data/dataloader.py&q…...

深入理解C++中string的深浅拷贝

目录 一、引言 二、浅拷贝与深拷贝的基本概念 2.1 浅拷贝 2.2 深拷贝 在C 中&#xff0c; string 类的深浅拷贝有着重要的区别。 浅拷贝 深拷贝 string 类中的其他构造函数及操作 resize 构造 构造&#xff08;赋值构造&#xff09; 构造&#xff08;拼接构造&#xf…...

性能测试面试题的详细解答

以下是性能测试面试题的详细解答&#xff1a; 1. 性能测试的流程是怎样的&#xff1f; 性能测试流程通常包括以下几个步骤&#xff1a; - **需求分析**&#xff1a;明确测试目标、性能指标&#xff08;如响应时间、吞吐量等&#xff09;。 - **环境搭建**&#xff1a;搭建测试环…...

第八篇:系统分析师第三遍——3、4章

目录 一、目标二、计划三、完成情况四、意外之喜(最少2点)1.计划内的明确认知和思想的提升标志2.计划外的具体事情提升内容和标志 五、总结 一、目标 通过参加考试&#xff0c;训练学习能力&#xff0c;而非单纯以拿证为目的。 1.在复习过程中&#xff0c;训练快速阅读能力、掌…...

Unity粒子特效打包后不显示

1.粒子发mesh&#xff0c;如果打包后不显示&#xff0c;尝试勾选r/w 2.如果还不行&#xff0c;mesh重做&#xff0c;目前发现ab包打出的&#xff0c;有的mesh会出问题&#xff0c;暂时原因不详。...

PFC 是什么?

现在进行液晶电视机和等离子电视机电路分析时、故障维修时&#xff0c;都经常的提到“PFC 电路”一词&#xff0c;这 在早期的电视机中是没有的&#xff0c;早期维修电视机的师傅从来没有接触过的&#xff0c;但是 PFC 电路是目前液晶电视机 和等离子电视机中不可缺少的电路。那…...