Java热门技术点总结:Lambda表达式与Stream API

2458dc40093e431587fe80e437b2c7ec.png

第一部分:Lambda表达式

1. 简介

Lambda表达式是Java 8引入的一个非常重要的特性,它提供了一种简洁、灵活的函数式编程方式。Lambda表达式允许我们将函数作为参数传递,极大的简化了代码的编写。

2. 基本语法

Lambda表达式的基本语法如下:

(parameters) -> expression
或
(parameters) -> { statements; }
  • 参数:Lambda表达式的参数可以省略数据类型,编译器会根据上下文自动推断。
  • 表达式:如果Lambda表达式只包含一个表达式,则可以省略花括号和return关键字。
  • 语句:如果Lambda表达式包含多个语句,则需要使用花括号和return关键字。

3. 函数接口

Lambda表达式需要有一个目标类型,也就是所谓的函数接口。函数接口是只有一个抽象方法的接口,可以包含默认方法、静态方法。Lambda表达式会被匹配到这个抽象方法上。

4. 示例

下面我们通过一个简单的示例来演示Lambda表达式的使用。

import java.util.Arrays;
import java.util.List;

public class LambdaDemo {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);

        // 使用Lambda表达式遍历列表
        list.forEach(item -> System.out.println(item));
    }
}

在上面的代码中,我们使用Lambda表达式替代了传统的for循环,使得代码更加简洁、易读。

5. 方法引用

Java 8还引入了方法引用,它提供了一种更简洁的方式来表示Lambda表达式。方法引用可以分为三类:

  • 静态方法引用:ClassName::staticMethodName
  • 实例方法引用:instanceReference::instanceMethodName
  • 构造方法引用:ClassName::new

示例:

import java.util.function.BiFunction;

public class MethodReferenceDemo {
    public static void main(String[] args) {
        BiFunction<String, String, String> function = (a, b) -> a.concat(b);
        BiFunction<String, String, String> functionRef = String::concat;

        System.out.println(function.apply("Hello", " World"));
        System.out.println(functionRef.apply("Hello", " World"));
    }
}

在上面的代码中,我们使用方法引用简化了Lambda表达式。

6. 变量作用域

Lambda表达式可以捕获外部变量,但是这些变量必须是事实最终变量(effectively final),也就是说在Lambda表达式外部,这些变量不能被重新赋值。

示例:

public class VariableScopeDemo {
    public static void main(String[] args) {
        int num = 10;
        Runnable runnable = () -> System.out.println(num);
        new Thread(runnable).start();
    }
}

在上面的代码中,我们捕获了外部变量num,并在Lambda表达式中输出。

7. 总结

Lambda表达式是Java 8引入的一个非常重要的特性,它使得Java的函数式编程变得更加简洁、灵活。通过本文的介绍,相信大家对Lambda表达式有了更深入的了解。在下一部分,我们将介绍另一个Java 8的热门技术点:Stream API。

第二部分:Stream API

8. 简介

Stream API 是 Java 8 中另一个革命性的变化,它提供了一种高效且易于使用的处理数据的方法。Stream API 可以用于执行复杂的集合操作,如过滤、映射、排序等,而且可以很容易地并行化操作。

9. 创建 Stream

在 Java 中,有多种方式可以创建 Stream:

  • 通过集合的 stream() 和 parallelStream() 方法。
  • 通过 Arrays.stream(Object[]) 方法。
  • 使用 Stream 类的静态方法,如 Stream.of(T... values)IntStream.range(int start, int end) 等。

示例:

List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();

10. 常用 Stream 操作

Stream API 提供了丰富的操作符来进行数据处理,这些操作可以分为两大类:中间操作(intermediate operations)和终端操作(terminal operations)。

中间操作

中间操作返回的是一个新的 Stream,可以链式调用多个中间操作。常见的中间操作包括:

  • filter:过滤元素。
  • map:转换每个元素到对应的结果。
  • sorted:对元素进行排序。

示例:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> squares = numbers.stream()
                               .filter(n -> n % 2 == 0)
                               .map(n -> n * n)
                               .collect(Collectors.toList());

终端操作

终端操作返回的是一个结果或者一个副作用,比如 forEachcollectreduce 等。终端操作结束后,Stream 对象就失效了。

示例:

numbers.stream().forEach(System.out::println);

11. 并行流

Stream API 支持并行流,可以很方便地将操作并行化,以提高性能。只需将普通 Stream 转换为并行流即可。

示例:

List<String> list = Arrays.asList("a", "b", "c");
list.parallelStream().forEach(item -> System.out.println(item));

12. Optional

Optional 是一个容器对象,它可能包含也可能不包含非空值。Optional 类主要用来解决空指针异常的问题。

示例:

Optional<String> optional = Optional.of("hello");
optional.ifPresent(System.out::println);

13. 总结

Stream API 是 Java 8 中处理集合数据的强大工具,它提供了简洁、易读且功能丰富的操作符。通过本文的介绍,相信大家对 Stream API 有了更深入的了解。在下一部分,我们将探讨 Lambda 表达式和 Stream API 在实际开发中的应用场景和最佳实践。

第三部分:应用场景与最佳实践

14. 应用场景

Lambda表达式和Stream API在日常开发中有着广泛的应用场景,它们可以提高代码的可读性和效率,特别是在处理集合数据时。

14.1 数据处理

在数据处理的场景中,Lambda表达式和Stream API可以极大地简化代码。例如,假设我们有一个学生列表,我们需要对这个列表进行过滤、排序和转换。

List<Student> students = // ... 获取学生列表
List<String> names = students.stream()
    .filter(student -> student.getGrade() >= 3.5) // 过滤成绩大于等于3.5的学生
    .sorted(Comparator.comparing(Student::getGrade).reversed()) // 按成绩降序排序
    .map(Student::getName) // 提取学生姓名
    .collect(Collectors.toList()); // 收集结果

14.2 并行计算

在需要执行大量计算的任务时,使用并行流可以显著提高性能。例如,对一个大型数组进行并行求和:

int[] numbers = // ... 大型数组
int sum = Arrays.stream(numbers).parallel().sum();

14.3 事件处理

在图形用户界面(GUI)编程中,Lambda表达式可以用来简化事件处理代码。例如,使用JavaFX添加按钮点击事件:

button.setOnAction(event -> System.out.println("Button clicked!"));

14.4 集合初始化

Lambda表达式和Stream API可以用来初始化集合,特别是在需要生成复杂集合结构时。

List<Integer> primes = Stream.iterate(2, n -> n + 1)
    .filter(n -> isPrime(n))
    .limit(10)
    .collect(Collectors.toList());

15. 最佳实践

在使用Lambda表达式和Stream API时,有一些最佳实践可以帮助我们写出更高效、更可维护的代码。

15.1 避免过度使用

虽然Lambda表达式和Stream API很强大,但它们并不总是最佳选择。在处理简单任务时,过度使用它们可能会导致代码不必要的复杂。

15.2 注意性能

在性能敏感的应用中,应该谨慎使用并行流。并行流并不总是比顺序流更快,因为并行流涉及到线程开销和数据分割。

15.3 使用Optional避免空指针

使用Optional可以有效地避免空指针异常,提高代码的健壮性。

Optional<String> optional = Optional.ofNullable(getString());
optional.ifPresent(System.out::println);

15.4 保持代码可读性

虽然Lambda表达式可以写出非常简洁的代码,但过度的简洁可能会损害代码的可读性。在编写Lambda表达式时,应该保持适当的格式化和注释。

16. 总结

Lambda表达式和Stream API是Java 8中引入的两个非常强大的特性,它们改变了我们处理集合数据的方式。通过本文的介绍,我们不仅了解了这些技术点的基本用法,还学习了它们在实际开发中的应用场景和最佳实践。希望这些内容能够帮助你在日常工作中更有效地使用这些工具,写出更简洁、更高效、更健壮的Java代码。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

聚类模型的算法性能评价

一、概述 作为机器学习领域的重要内容之一&#xff0c;聚类模型在许多方面能够发挥举足轻重的作用。所谓聚类&#xff0c;就是通过一定的技术方法将一堆数据样本依照其特性划分为不同的簇类&#xff0c;使得同一个簇内的样本有着更相近的属性。依不同的实现策略&#xff0c;聚类…

目标检测之YoloV1

一、预测阶段&#xff08;前向推断&#xff09; 在预测阶段Yolo就相当于一个黑箱子&#xff0c;输入的是448*448*3的图像&#xff0c;输出是7*7*30的张量&#xff0c;包含了所有预测框的坐标、置信度和类别 为什么是7*7*30呢&#xff1f; --将输入图像划分成s*s个grid cell&a…

stm32 No traget connected/debug识别不到串口的问题

关于stm32串口识别不到&#xff0c;第一步先确定是否线接错&#xff08;stlink与stm32接口对应&#xff09;&#xff0c;如果确认接线没有问题的话&#xff0c;可以使用以下方法&#xff0c;成功率较高。 首先将stlink的boot0置1&#xff0c;就是把跳线帽换到高电平这一侧&…

专业技术!最新氧化物异质结纳米制备技术

网盘 https://pan.baidu.com/s/1vjO2yLxm638YpnqDQmX7-g?pwd3at5 MOF衍生的B_A_B结构氧化物异质结及其制备方法和应用.pdf 二硫化钼-硫化镉纳米复合材料及其制备方法和应用.pdf 具有异质界面的耐辐照复合薄膜及其制备方法与应用.pdf 基于异质结双界面层纳米材料的复合介电薄膜…

基于单片机和LabVIEW 的远程矿井水位监控系统设计

摘要 &#xff1a; 针 对 现 有 矿 井 水 位 监 控 系 统 存 在 结 构 复 杂 和 不 能 远 程 监 控 的 问 题 &#xff0c; 设计了基于单片机和&#xff2c;&#xff41;&#xff42;&#xff36;&#xff29;&#xff25;&#xff37; 的远程矿井水位监控系统 &#xff0c; 详…

获取当前操作系统的名称platform.system()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 获取当前操作系统的名称 platform.system() [太阳]选择题 在Python中&#xff0c;platform.system() 函数被用来获取什么信息&#xff1f; import platform print("【执行】platform.s…

Python数据分析第二课:conda的基础命令

Python数据分析第二课&#xff1a;conda的基础命令 1.conda是什么? conda是一个开源的包管理系统&#xff0c;可以帮助我们进行管理多个不同版本的软件包&#xff0c;还可以帮助我们建立虚拟环境&#xff0c;以便对不同的项目进行隔离。 简单来说&#xff0c;conda是一个软…

充电站,正在杀死加油站

最近&#xff0c;深圳公布了一组数据&#xff0c;深圳的超级充电站数量已超过传统加油站数量&#xff0c;充电枪数量也已超过加油枪数量。 从全国范围看&#xff0c;加油站关停的速度在加快。 充电站正在杀死加油站。 加油站&#xff0c;未来何去何从&#xff1f; 01. 减少 我…

概率论论文(关于“到课率”的贝叶斯推理应用)

概率论论文(关于“到课率”的贝叶斯推理应用) 全条件概率公式和贝叶斯公式趣味识 思考1&#xff1a; (引自贝叶斯公式及朴素贝叶斯分类算法应用初探) “狼来了”的故事想必大家都知道&#xff0c;小孩子第三次对村民说狼来了的时候&#xff0c;村民们没有相信他的话&#xff0…

windows 10 通过wsl安装ubuntu子系统教程

本章教程,主要记录我昨天通过Windows10 wsl安装Ubuntu的安装过程。其中遇到很多问题。 一、确定是否满足条件 系统要求操作系统版本: 需要 Windows 10 版本 1903 或更高版本,且操作系统内部版本号为 18362 或更高。 建议使用最新版本的 Windows 10 以获得最佳性能和最新功能…

VUE项目安全漏洞扫描和修复

npm audit 1、npm audit是npm 6 新增的一个命令,可以允许开发人员分析复杂的代码并查明特定的漏洞。 2、npm audit名称执行&#xff0c;需要包package.json和package-lock.json文件。它是通过分析 package-lock.json 文件&#xff0c;继而扫描我们的包分析是否包含漏洞的。 …

AI数据分析007:根据Excel表格数据绘制柱形图

文章目录 一、介绍二、输入内容三、输出内容一、介绍 将Excel文件中2013年至2019年间线上图书的销售额,以条形图的形式呈现,每个条形的高度代表相应年份的销售额,同时在每个条形上方标注具体的销售额数值 二、输入内容 在deepseek中输入提示词: 你是一个Python编程专家,…

【PostgreSQL】守护数据安全:事务与数据完整性管理

目录 事务管理&#xff1a;确保操作的原子性 事务的概念与重要性 事务的启动与提交 事务的回滚&#xff08;ROLLBACK&#xff09;&#xff08; 数据一致性与隔离级别 隔离级别的解释 设置隔离级别 错误处理与事务的高级策略 异常处理&#xff08;SAVEPOINT & EXCE…

算法刷题日志 —— 数组和位运算

文章目录 [461. 汉明距离](https://leetcode.cn/problems/hamming-distance/submissions/542447020/)[448. 找到所有数组中消失的数字](https://leetcode.cn/problems/find-all-numbers-disappeared-in-an-array/submissions/)[136. 只出现一次的数字](https://leetcode.cn/pro…

C# 超简单的离线人脸识别库 - ViewFaceCore

项目介绍 ViewFaceCore是一个基于 SeetaFace6 的 .NET 人脸识别解决方案。 项目特点 开源&#xff08;MIT license&#xff09;、免费、简单的离线人脸识别库。 跨平台&#xff08;适用于 Windows、MacOS 和 Linux &#xff09;。 .NET 框架 和 操作系统 封装完善的NuGet包…

openssl 命令行生成密钥对,生成hash,PSS填充签名,校验

生成密钥对(RSA4096) openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:4096 openssl rsa -pubout -in private_key.pem -out public_key.pem将源文件data.txt生成hash值&#xff08;sha-256&#xff09; openssl dgst -sha256 -binary data.t…

数字黄金 vs 全球计算机:比特币与以太坊现货 ETF 对比

撰文&#xff1a;Andrew Kang 编译&#xff1a;J1N&#xff0c;Techub News 本文来源香港Web3媒体&#xff1a;Techub News 比特币现货 ETF 的通过为许多新买家打开了进入加密货币市场的大门&#xff0c;让他们可以在投资组合中配置比特币。但以太坊现货 ETF 的通过&#xf…

YOLOv8改进 | 注意力机制 | 迈向高质量像素级回归的极化自注意力【全网独家】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有…

kafka consumer客户端消费逻辑解析

kafka consumer客户端消费逻辑解析 一、主要消费步骤二、提交策略【步骤2代码解析】【提交策略总结】 三、拉取策略&#xff08;待补充&#xff09;四、消费策略【代码解析】【消费策略总结】 一、主要消费步骤 这是kafka客户端拉取消息的入口&#xff0c;有4个主要部分 1、启…

IDEA使用Apidocx插件在RAP生成接口文档

第一步 安装插件&#xff0c;安装最新的1.1.7即可&#xff0c;插件与idea版本对照 第二步 输入对应的IP或域名&#xff0c;端口说明&#xff1a; 1. 38080&#xff1a;为后端数据 API 服务器&#xff08;rap2-delos&#xff09; 2. 3000&#xff1a;为前端静态资源服务&…