Lambda表达式的高级用法

今天来分享下Java的Lambda表达式,以及它的高级用法。

使用它可以提高代码的简洁度,使代码更优雅。

一、什么是lambda表达式

Lambda 表达式是 Java 8 引入的特性,用于简化匿名内部类的语法,使代码更简洁,尤其在处理函数式接口时。

二、Lambda表达式的12个高级用法

1. 集合遍历(foreach)

  • 普通写法
List<String> names = Arrays.asList("Alice", "Bob");
for(String name : names){System.out.println(name);
}
  • 优雅写法1
List<String> names = Arrays.asList("Alice", "Bob");
names.forEach(name -> System.out.println(name));
  • 优雅写法2
names.forEach(System.out::println);

2. 条件过滤(filter)

  • 传统写法
List<String> filtered = new ArrayList<>();
for (String s : list) {if (s.startsWith("A")) {filtered.add(s);}
}
  • 优雅写法
List<String> filtered = list.stream().filter(s -> s.startsWith("A")).collect(Collectors.toList());

3. 映射转换(map)

  • 普通写法
List<String> names = Arrays.asList("Alice", "Bob");
List<Person> people = new ArrayList<>();
for (String name : names) {people.add(new Person(name));
}
  • 优雅写法
List<Person> people = names.stream().map(Person::new).collect(Collectors.toList());

4. 分组统计(groupingBy)

  • 普通写法
Map<String, List<Person>> peopleByCity = new HashMap<>();
for (Person person : people) {String city = person.getCity();if (!peopleByCity.containsKey(city)) {peopleByCity.put(city, new ArrayList<>());}peopleByCity.get(city).add(person);
}
  • 优雅写法
Map<String, List<Person>> peopleByCity = people.stream().collect(Collectors.groupingBy(Person::getCity));

5. 求和(reduce)

  • 普通写法
List<Integer> nums = Arrays.asList(1, 2, 3);
int sum = 0;
for (Integer n : nums) {sum += n;
}
  • 优雅写法
int sum = nums.stream().reduce(0, (a, b) -> a + b);

6. 排序(Comparator)

  • 普通写法
List<String> names = Arrays.asList("Bob", "Alice");
Collections.sort(names, new Comparator<String>() {@Overridepublic int compare(String a, String b) {return a.compareTo(b);}
});
  • 优雅写法1
names.sort((a, b) -> a.compareTo(b));
// 或方法引用:
  • 优雅写法2
names.sort(String::compareTo);

7. 替代匿名内部类(Runnable)

  • 普通写法
new Thread(new Runnable() {@Overridepublic void run() {System.out.println("Thread running");}
}).start();
  • 优雅写法
new Thread(() -> System.out.println("Thread running")).start();

8. 链式操作(多条件处理)

  • 普通写法
List<String> result = new ArrayList<>();
for (String name : names) {if (name.startsWith("A")) {result.add(name.toUpperCase());}
}
  • 优雅写法
names.stream().filter(name - > name.startsWith("A")).map(String::toUpperCase).collect(Collectors.toList());

9. 并行流处理(Parallel)

  • 普通写法
List<Integer> nums = Arrays.asList(1, 2, 3);ExecutorService executor = Executors.newFixedThreadPool(2);
for (Integer n : nums) {executor.submit(() -> process(n));
}
executor.shutdown();
  • 优雅写法
nums.parallelStream().forEach(n -> process(n));

10. 自定义函数式接口

  • 普通写法
// 定义函数式接口
@FunctionalInterface
interface MathOperation {int operate(int a, int b);
}MathOperation add = new MathOperation() {@Overridepublic int operate(int a, int b) {return a + b;}
};
  • 优雅写法
MathOperation add = (a, b) -> a + b;
MathOperation multiply = (a, b) -> a * b;

11. optional的链式操作

  • 普通写法
Optional<String> optional = Optional.of("test");if (optional.isPresent()) {String value = optional.get();System.out.println(value.toUpperCase());
}
  • 优雅写法
optional.map(String::toUpperCase).ifPresent(System.out::println);

12. 谓词组合(Predicate.and/or)

  • 普通写法
List<Integer> nums = Arrays.asList(1, 2, 3, 4);List<Integer> filtered = new ArrayList<>();
for (Integer n : nums) {if (n > 1 && n < 4) {filtered.add(n);}
}
  • 优雅写法
Predicate<Integer> greaterThan1 = n -> n > 1;
Predicate<Integer> lessThan4 = n -> n < 4;
List<Integer> filtered = nums.stream().filter(greaterThan1.and(lessThan4)).collect(Collectors.toList());

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

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

相关文章

31-35【动手学深度学习】深度学习硬件

1. CPU和GPU 1.1 CPU CPU每秒钟计算的浮点运算数为0.15&#xff0c;GPU为12。GPU的显存很低&#xff0c;16GB&#xff08;可能32G封顶&#xff09;&#xff0c;CPU可以一直插内存。 左边是GPU&#xff08;只能做些很简单的游戏&#xff0c;视频处理&#xff09;&#xff0c;中…

【MySQL成神之路】MySQL常见命令汇总

目录 MySQL常用命令总结 1. 数据库操作 2. 表操作 3. 数据操作&#xff08;DML&#xff09; 4. 索引与优化 5. 用户与权限管理 6. 备份与恢复 7. 事务控制 8. 常用函数 9. 系统状态与日志 总结 MySQL常用命令总结 MySQL作为最流行的关系型数据库之一&#xff0c;提供…

Dify的大语言模型(LLM) AI 应用开发平台-本地部署

前言 今天闲着&#xff0c;捣鼓一下 Dify 这个开源平台&#xff0c;在 mac 系统上&#xff0c;本地部署并运行 Dify 平台&#xff0c;下面记录个人在本地部署Dify 的过程。 Dify是什么&#xff1f; Dify是一个开源的大语言模型&#xff08;LLM&#xff09;应用开发平台&#…

【论文阅读】针对BEV感知的攻击

Understanding the Robustness of 3D Object Detection with Bird’s-Eye-View Representations in Autonomous Driving 这篇文章是发表在CVPR上的一篇文章&#xff0c;针对基于BEV的目标检测算法进行了两类可靠性分析&#xff0c;即恶劣自然条件以及敌对攻击。同时也提出了一…

SonarQube的核心作用与用途

SonarQube作为一个开源的代码质量管理平台&#xff0c;致力于持续分析代码的健康状态&#xff0c;帮助开发团队提升代码质量。以下是其核心作用与用途的详细说明&#xff1a; 1、静态代码分析 SonarQube通过静态代码分析技术&#xff0c;自动识别代码中的潜在问题。它能够检测…

AI工程师系列——面向copilot编程

前言 ​ 笔者已经使用copilot协助开发有一段时间了,但一直没有总结一个协助代码开发的案例,特别是怎么问copilot,按照什么顺序问,哪些方面可以高效的生成需要的代码,这一次,笔者以IP解析需求为例,沉淀一个实践案例,供大家参考 当然,其实也不局限于copilot本身,类似…

【软件设计师】知识点简单整理

文章目录 数据结构与算法排序算法图关键路径 软件工程决策表耦合类型 编程思想设计模式 计算机网络域名请求过程 数据结构与算法 排序算法 哪些排序算法是稳定的算法?哪些不是稳定的算法,请举出例子。 稳定排序算法&#xff1a;冒泡排序、插入排序、归并排序、基数排序、计数…

FastAPI 支持文件下载和上传

文章目录 1. 文件下载处理1.1. 服务端处理1.1.1. 下载小文件1.1.2. 下载大文件&#xff08;yield 支持预览的&#xff09;1.1.3. 下载大文件&#xff08;bytes&#xff09;1.1.4. 提供静态文件服务1.1.5. 中文文件名错误 1.2. 客户端处理1.2.1. 普通下载1.2.2. 分块下载1.2.3. …

naive-ui切换主题

1、在App.vue文件中使用 <script setup lang"ts"> import Dashboard from ./views/dashboard/index.vue import { NConfigProvider, NGlobalStyle, darkTheme } from naive-ui import { useThemeStore } from "./store/theme"; // 获取存储的主题类…

Kotlin 协程 (三)

协程通信是协程之间进行数据交换和同步的关键机制。Kotlin 协程提供了多种通信方式&#xff0c;使得协程能够高效、安全地进行交互。以下是对协程通信的详细讲解&#xff0c;包括常见的通信原语、使用场景和示例代码。 1.1 Channel 定义&#xff1a;Channel 是一个消息队列&a…

使用SQLite Studio导出/导入SQL修复损坏的数据库

使用SQLite Studio导出/导入SQL修复损坏的数据库 使用Zotero时遇到了数据库损坏&#xff0c;在软件中寸步难行&#xff0c;遂尝试修复数据库。 一、SQLite Studio简介 SQLite Studio是一款专为SQLite数据库设计的免费开源工具&#xff0c;支持Windows/macOS/Linux。相较于其…

【git config --global alias | Git分支操作效率提升实践指南】

git config --global alias | Git分支操作效率提升实践指南 背景与痛点分析 在现代软件开发团队中&#xff0c;Git分支管理是日常工作的重要组成部分。特别是在规范的开发流程中&#xff0c;我们经常会遇到类似 feature/user-management、bugfix/login-issue 或 per/cny/dev …

(八)深度学习---计算机视觉基础

分类问题回归问题聚类问题各种复杂问题决策树√线性回归√K-means√神经网络√逻辑回归√岭回归密度聚类深度学习√集成学习√Lasso回归谱聚类条件随机场贝叶斯层次聚类隐马尔可夫模型支持向量机高斯混合聚类LDA主题模型 一.图像数字化表示及建模基础 二.卷积神经网络CNN基本原…

在tensorflow源码环境里,编译出独立的jni.so,避免依赖libtensorflowlite.so,从而实现apk体积最小化

需要在APP里使用tensorflow lite来运行PC端训练的model.tlite&#xff0c;又想apk的体积最小&#xff0c;尝试了如下方法&#xff1a; 1. 在gradle里配置 implementation("org.tensorflow:tensorflow-lite:2.16.1") 这样会引入tensorflow.jar&#xff0c;最终apk的…

neo4j框架:java安装教程

安装使用neo4j需要事先安装好java&#xff0c;java版本的选择是一个犯难的问题。本文总结了在安装java和使用Java过程中遇到的问题以及相应的解决方法。 Java的安装包可以在java官方网站Java Downloads | Oracle 中国进行下载 以java 8为例&#xff0c;选择最后一行的x64 compr…

[服务器备份教程] Rclone实战:自动备份数据到阿里云OSS/腾讯云COS等对象存储

更多服务器知识&#xff0c;尽在hostol.com 各位服务器的守护者们&#xff0c;咱们都知道&#xff0c;数据是数字时代的“黄金”&#xff0c;而服务器上的数据更是我们业务的命脉。可天有不测风云&#xff0c;硬盘可能会突然“寿终正寝”&#xff0c;手滑执行了“毁灭性”命令…

Nextjs App Router 开发指南

Next.js是一个用于构建全栈web应用的React框架。App Router 是 nextjs 的基于文件系统的路由器&#xff0c;它使用了React的最新特性&#xff0c;比如 Server Components, Suspense, 和 Server Functions。 术语 树(Tree): 一种用于可视化的层次结构。例如&#xff0c;包含父…

山东大学计算机图形学期末复习15——CG15

CG15 OpenGL缓冲区、读写操作以及混合&#xff08;Blending&#xff09; 一、OpenGL缓冲区概述 OpenGL中的缓冲区是用于存储像素数据的内存区域&#xff0c;主要包括以下类型&#xff1a; 颜色缓冲区&#xff08;Color Buffer&#xff09;&#xff1a;存储每个像素的颜色值…

html+css+js趣味小游戏~记忆卡片配对(附源码)

下面是一个简单的记忆卡片配对游戏的完整代码&#xff0c;使用HTML、CSS和JavaScript实现&#xff1a; html <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"wid…

⼀个并发访问量⽐较⼤的key在某个时间过期,在redis中这个时间过期什么意思

在 Redis 中&#xff0c;当提到一个键&#xff08;key&#xff09;“在这个时间过期”&#xff0c;指的是为该键设置了生存时间&#xff08;TTL, Time To Live&#xff09;或过期时间&#xff08;expiration time&#xff09;。一旦到达设定的过期时间&#xff0c;Redis 会自动…