Java中Lambda Stream详解

Java中Lambda Stream详解

Java中Lambda / Stream详解


🔥 一、Lambda 是什么?(核心概念)

根据资料 LabExDEV Community

Lambda 是 Java 8 引入的匿名函数,用来简化只有一个抽象方法的接口(函数式接口)的写法。

换句话说:
Lambda = 更简洁的函数写法
Lambda = 传递行为(函数)而不是传递对象

📌 Lambda 的基本语法

(parameters)-> expression (parameters)->{ statements }

📌 示例:传统写法 vs Lambda

传统写法(匿名类)
newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("Hello");}}).start();
Lambda 写法
newThread(()->System.out.println("Hello")).start();

更短、更清晰。


🔥 二、Lambda 的本质:函数式接口

资料 DEV Community指出:

Lambda 必须依附于“函数式接口”(只包含一个抽象方法的接口)。

常见函数式接口:

  • Runnable
  • Callable
  • Comparator
  • Predicate<T>
  • Function<T,R>
  • Consumer<T>
  • Supplier<T>

示例:

Predicate<Integer> isEven = n -> n %2==0;

🔥 三、Stream 是什么?(核心概念)

根据资料 LabExBaeldungStack Abuse

Stream 是对集合进行声明式(非命令式)处理的 API,支持链式操作、并行处理、惰性求值。

Stream 不是集合,它不存储数据,只是数据的“流水线”。


🔥 四、Stream 的三大步骤

资料 Baeldung指出 Stream 的典型结构:

1️⃣ 创建 Stream

List<Integer> list =List.of(1,2,3);Stream<Integer> s = list.stream();

2️⃣ 中间操作(返回 Stream)

  • filter
  • map
  • sorted
  • distinct
  • limit
  • skip

3️⃣ 终止操作(返回结果)

  • collect
  • forEach
  • reduce
  • count
  • findFirst

🔥 五、Lambda + Stream 实战详解

⭐ 1. filter(过滤)

资料 LabExBaeldungStack Abuse都强调 filter 是最常用的操作。

List<Integer> nums =List.of(1,2,3,4,5,6);List<Integer> even = nums.stream().filter(n -> n %2==0).toList();

⭐ 2. map(映射)

把一个值转换成另一个值。

List<String> names =List.of("a","bb","ccc");List<Integer> lengths = names.stream().map(s -> s.length()).toList();

⭐ 3. sorted(排序)

List<Integer> sorted = nums.stream().sorted((a,b)-> b - a).toList();

⭐ 4. reduce(聚合)

int sum = nums.stream().reduce(0,(a,b)-> a + b);

⭐ 5. collect(收集)

List<String> upper = names.stream().map(String::toUpperCase).collect(Collectors.toList());

🔥 六、Stream 的特性(必须掌握)

1️⃣ 惰性求值(Lazy Evaluation)

中间操作不会立即执行,只有终止操作才会触发。

2️⃣ 不修改原集合(函数式思想)

Stream 是不可变的。

3️⃣ 可并行(parallelStream)

list.parallelStream().filter(...).map(...).toList();

🔥 七、Lambda 与 Stream 的最佳实践(来自资料 Java Guides

✔ 写法简洁但不要过度链式

避免一行写 10 个操作,可读性会变差。

✔ 避免在 Stream 中写复杂逻辑

Stream 适合“数据转换”,不适合复杂业务。

✔ 优先使用方法引用(更清晰)

list.stream().map(String::toUpperCase)

✔ 不要滥用 parallelStream

并行流适合 CPU 密集型任务,不适合 IO。


🔥 八、完整示例:从集合到结果的全流程

List<String> names =List.of("Alice","Bob","Charlie","David");List<String> result = names.stream().filter(n -> n.length()>3)// 过滤.map(String::toUpperCase)// 转换.sorted()// 排序.toList();// 收集

输出:

[Alice, Charlie, David] → [ALICE, CHARLIE, DAVID] 

📚 引用来源

  • LabExLabEx:Java Lambda 与 Stream 过滤教程
  • DEV CommunityDev.to:Lambda、函数式接口、Stream 深度解析
  • BaeldungBaeldung:Stream.filter 使用指南
  • Stack AbuseStackAbuse:Stream + Lambda 过滤示例

Read more

用OpenClaw做飞书ai办公机器人(含本地ollama模型接入+自动安装skills+数据可视化)

用OpenClaw做飞书ai办公机器人(含本地ollama模型接入+自动安装skills+数据可视化)

执行git clone https://github.com/openclaw/openclaw克隆项目,执行cd openclaw进入项目 执行node --version看看node的版本是否大于等于22(没有node.js需自行安装),再执行npm install -g pnpm安装作为包管理器,并执行pnpm install安装依赖 首次执行pnpm ui:build构建 Web UI(会先安装 ui/ 目录的依赖) 执行pnpm build构建主程序 执行pnpm openclaw onboard --install-daemon运行配置向导(安装守护进程),完成初始化 按键盘右箭头选择Yes,同样Yes 任选一个模型提供商都行,没有对应的提供商的密钥可以跳过,如果是本地模型选vLLM(需用vLLM框架启动模型,有性能优势,但原生vLLM仅完全支持Linux的cuda)、Custom Provider(可以连接任何 OpenAI 或 Anthropic 兼容的端点,

By Ne0inhk

基于YOLOv10n-SOEP-PST的跟随式助老机器人目标检测与识别系统详解

1. 基于YOLOv10n-SOEP-PST的跟随式助老机器人目标检测与识别系统详解 【CC 4.0 BY-SA版权 版权声明:本文为博主原创文章,遵循版权协议,转载请附上原文出处链接和本声明。 文章标签: 深度学习 同时被 2 个专栏收录 这个损失函数由五个部分组成:边界框坐标损失(前两行)、置信度损失(第三、四行)和分类损失(最后一行)。 λ c o o r d \lambda_{coord} λcoord 和 λ n o o b j \lambda_{noobj} λnoobj 是权重参数,用于平衡不同损失的重要性。 I i j o b j

By Ne0inhk
突破机器人通讯架构瓶颈,CAN/FD、高速485、EtherCAT,哪种总线才是最优解?

突破机器人通讯架构瓶颈,CAN/FD、高速485、EtherCAT,哪种总线才是最优解?

引言: 从协作机械臂到人形机器人,一文拆解主流总线技术选型困局 在机器人技术飞速发展的今天,从工厂流水线上的协作机械臂到科技展会上的人形机器人,它们的“神经系统”——通讯总线,正面临着前所未有的挑战。特斯拉Optimus的精准动作、波士顿动力Atlas的流畅跑跳,背后都是海量数据的高速交互。 然而,许多工程师在项目初期都会陷入同一个困境:面对RS485、CAN/CAN FD、EtherCAT等多种总线方案,究竟该如何选择? 本文将从机器人类型与需求分析出发,深入剖析三大主流总线技术的优劣,不提供“标准答案”,只提供一套科学的选择方法论。 一、机器人类型与通讯需求拆解 不同机器人的自由度、运动复杂度和性能要求,直接决定了其通讯总线的选择方向。下图概括了三种典型机器人的通讯需求与方案选择: 1. 低自由度/轻量型机器人(6-12自由度) 典型代表:协作机械臂、AGV小车、桌面级教育机器人。 核心需求:成本敏感、可靠性、易于集成、适度实时性(毫秒级)。这类机器人节点数相对较少,数据量不大,但对性价比要求极高。 现有主流方案:CAN

By Ne0inhk

一:ROS2+gazebo+PX4环境搭建:环境搭建到无人机起飞

前言 写博客记录学习的过程。 由于博客是安装完环境后写的,因此实际可能会有一些出入,但是实际上也大差不差的。 环境搭建 前置环境 * ROS2 humble * Gazebo Classic (11) 1.下载 PX4 源码 在你的 Home 目录下,用 Git 克隆 PX4 的代码仓库,并更新所有子模块。 git clone https://github.com/PX4/PX4-Autopilot.git --recursive 注意:由于这个源码中包含许多子模块,因此不建议到github主页下载zip再解压,这样做会缺失许多子模块。使用大陆的网络克隆起来会十分慢,因此强烈建议大家使用网络加速! 2.运行自动安装脚本 PX4 提供了自动化脚本,可以帮你安装编译仿真环境所需的所有依赖。 cd PX4-Autopilot bash ./Tools/setup/

By Ne0inhk