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

news2024/10/7 12:24:58

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代码。

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

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

相关文章

EAK高压电阻器-引线高压电阻器-厚膜高压电阻器

描述 EAK高压电阻器是扁平高压电阻器&#xff0c;完全满足低感、稳定和精密无源元件的所有要求。 扁平高压电阻器最适合作为组装在 PCB 上的有线元件&#xff0c;但也可以用作 SMD 元件。 我们提供 HVR、HPR、HVI、HVD 和 HVS 系列的扁平高压电阻器&#xff0c;这些电阻器具…

基于weixin小程序农场驿站系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;农场资讯管理&#xff0c;用户管理&#xff0c;卖家管理&#xff0c;用户分享管理&#xff0c;分享类型管理&#xff0c;商品信息管理&#xff0c;商品类型管理 开发系统&#xff1a;Windows 架构模式&…

OWIN(.NET 开放 Web 接口)的幕后故事

在本文中&#xff0c;我们将了解 OWIN 是什么以及它的创建历史。本文将帮助那些想知道它背后的人。 我们将了解一群人如何为 .NET 社区带来宝贵的想法。同样重要的是&#xff0c;微软已经接受了 OWIN&#xff0c;而 ASP.NET Core 基本上就是建立在这个想法之上的。 简单来说&…

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

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

操作系统-中断和异常

中断和异常 用户态&#xff1a;普通应用程序运行在用户态&#xff0c;有很多权限限制 内核态&#xff1a;操作系统运行在内核态&#xff0c;有完全的权限访问和管理所有资源&#xff08;硬件&#xff0c;内存&#xff09; 中断的作用 把CPU从用户态变内核态 异常&#xff08…

谈谈WebComponents | 前端开发

一、 源起 让我们以一个例子开始。 假设我们要做一个环形进度条&#xff0c;它可以&#xff1a; 1、根据进度数值的不同&#xff0c;计算出百分比&#xff0c;以渲染对应的角度值。 2、根据设置的进度不同&#xff0c;我们用不同的颜色加以区分。 3、在环的中间我们以动画递增的…

[电子电路学]电路分析基本概念1

第一章 电路分析的基本概念和基本定律 电路模型 反映实际电路部件的主要电磁性质的理想电路元件及其组合&#xff0c;是实际电路电气特性的抽象和近似。 理想电路元件 实际电路器件品种繁多&#xff0c;其电磁特性多元而复杂&#xff0c;分析和计算时非常困难。而理想电路元件…

240627_关于CNN中图像维度变化问题

240627_关于CNN中图像维度变化问题 在学习一些经典模型时&#xff0c;其中得维度变化关系总搞不太明白&#xff0c;集中学习了以下&#xff0c;在此作以梳理总结&#xff1a; 一般来说涉及到的维度变换都是四个维度&#xff0c;当batch size4&#xff0c;图像尺寸为640*640&a…

正点原子 iwdg wwdg timr

这个iwdg 的超时时间的计算公式 ———————————————— wwdg 超时时间的计算公式 4096是stm32固定死的 wwdg的时钟频率是36mhz&#xff0c;因为apb1分频2得到wwdg的时钟频率&#xff0c;这个是stm32自己就这样做的 看cubemx的时钟图也看得出来 iwdg和wwdg的区分 ti…

[Java基础揉碎]反射

目录 引出反射机制​编辑 介绍反射机制​编辑 反射的优点和缺点 (反射调用优化 )​编辑 Class类 class常用方法 ​编辑 ​编辑 获取class类对象的不同方式 哪些类型有class对象 ​编辑 类加载 ​编辑类加载流程图 类加载的五个阶段 ​编辑 通过反射获取类的结构信…

合芯科技冯春阳博士受邀出席苏州大学技术分享会

近日&#xff0c;苏州大学电子信息学院与合芯科技苏州公司成功举办“新时代与‘芯’相遇&#xff0c;科技赋能向未来”的技术分享会。合芯科技冯春阳博士进行了主题为“高性能CPU关键技术与发展现状”的专题分享&#xff0c;并参加导师聘请仪式。苏州大学电子信息学院党委副书记…

【ONLYOFFICE 8.1】的安装与使用——功能全面的 PDF 编辑器、幻灯片版式、优化电子表格的协作

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言二、ONLYOFFICE 简介三、安装1. Windows/Mac 安装2. 文档开发者版安装安装前准备使用 Docker 安装使用 Linux 发行版安装配置 ONLYOFFICE 文档开发者版集成和开发 四、使用1. 功能全面的 PDF 编辑器PDF 查看和导航P…

如何做好新闻软文宣发媒体资源筛选?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体宣传加速季&#xff0c;100万补贴享不停&#xff0c;一手媒体资源&#xff0c;全国100城线下落地执行。详情请联系胡老师。 新闻软文宣发是指企业通过创造或利用新闻事件&#xff0c…

使用systemd管理Linux下的frps服务:安装、配置及自动化操作指南

在 Linux 系统下&#xff0c;使用 systemd 可以方便地控制 frps 服务端的启动、停止、配置后台运行以及开机自启动。以下是具体的操作步骤&#xff1a; 1. 安装 systemd 如果您的 Linux 服务器上尚未安装 systemd&#xff0c;可以使用包管理器如 yum&#xff08;适用于 Cent…

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

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

[数据集][目标检测]游泳者溺水检测数据集VOC+YOLO格式4599张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4599 标注数量(xml文件个数)&#xff1a;4599 标注数量(txt文件个数)&#xff1a;4599 标注…

编写一个基于其他系的linux系统并且把它打包为一个iso镜像思想

目录 前面写的一篇文章 前言 isolinux引导模式启动流程 为什么要initramdisk操作而不直接加载文件系统 编写系统的思想 可能问题 一般的iso镜像目前只支持最大4G的大小&#xff0c;需要怎么解决&#xff1f; 如何去找驱动 木木em哈哈想说的话&#xff08;与本博文无光&…

详细分析SpringBootTest中的测试类(附Demo)

目录 前言1. 基本知识2. Demo3. 实战3.1 项目测试3.2 功能测试 前言 书写测试类&#xff0c;一般只需要加入Test即可&#xff0c;但是结合Springboot项目来整体测试对应需要怎么下手 详细的Java知识点推荐阅读&#xff1a;java框架 零基础从入门到精通的学习路线 附开源项目面…

[CAN] 通讯协议手动解析与手动打包 [手撕编码格式]

手动解析与手动打包 一、Intel格式编码1.1 报文解析。1.2 报文打包二、Motorola格式通讯协议2.1 报文解析。2.2 报文打包🙋 前言 CAN有两种编码格式:Intel编码格式 和 Motorola编码格式,本教程将分别对两种格式进行手动解析与手动打包。 一、Intel格式编码 假设已知雷达CAN…

【C++题解】1721. 输出个位为5或者个位为8数

问题&#xff1a;1721. 输出个位为5或者个位为8数 类型&#xff1a;简单循环 题目描述&#xff1a; 请从小到大输出 1∼n 中所有个位为 5 或者个位为8 的所有的整数&#xff0c;每行 1 个。 比如&#xff0c;假设 n20&#xff0c;那么满足条件的数输出如下&#xff1a; 5 8 1…