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

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

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

相关文章

Java基于jjwt操作jwt

之前讲解了jwt的相关知识&#xff0c;有不了解的&#xff0c;可以查看相关的文章JWT简介-CSDN博客&#xff0c;本节不再介绍&#xff0c;主要讲解有关java中如何通过jjwt库产生jwt以及解析jwt的相关操作。 添加maven依赖 <dependency><groupId>io.jsonwebtoken&l…

目标检测之YoloV1

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

【多线程】如何解决线程安全问题?

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. synchronized 关键字1.1 锁是什么1.2 如何加锁1.3 synchronized 修饰方法1) 修饰普通成员方法2) 修饰静态…

【系统架构设计师】七、信息安全技术基础知识(访问控制技术|抗攻击技术|计算机系统安全保护能力等级)

目录 一、访问控制技术 二、信息安全的抗攻击技术 2.1 分布式拒绝服务DDoS与防御 2.3 ARP欺骗攻击与防御 2.4 DNS欺骗与防御 2.5 IP欺骗与防御 2.6 端口扫描&#xff08;Port Scanning&#xff09; 2.7 强化TCP/IP堆栈以抵御拒绝服务攻击 2.8 系统漏洞扫描 三、信息安…

基于weixin小程序乡村旅游系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商家管理&#xff0c;旅游景点管理&#xff0c;景点类型管理&#xff0c;景点路线管理&#xff0c;系统管理 商家帐号账号功能包括&#xff1a;系统首页&#xff0c;旅游景点管理&…

解决RuntimeError: Unsupported image type, must be 8bit gray or RGB image.

今天在使用Opencv进行人脸识别项目时发现了一个问题&#xff0c;一直报这个错误RuntimeError: Unsupported image type, must be 8bit gray or RGB image.查了一下资料也是解决了&#xff0c;这样给大家分享一下 解决方案 Numpy 有一个主要版本更新&#xff0c;与 dlib 不兼容。…

【Docker】创建 swarm 集群

目录 1. 更改防火墙设置 2. 安装 Docker 组件 3. 启动 Docker 服务&#xff0c;并检查服务状态。 4. 修改配置文件&#xff0c;监听同一端口号。 5. 下载 Swarm 组件 6. 创建集群&#xff0c;加入节点 7. 启动集群 8. 查询集群节点信息 9. 查询集群具体信息 10. 查询…

电脑文件concrt140.dll丢失要怎么恢复?靠谱修复方法分析

电脑文件concrt140.dll丢失这种情况&#xff0c;相对来说还是比较少见的&#xff01;但是不代表没有&#xff0c;既然有人出现这种情况了&#xff0c;那么小编势必要给大家详细的讲解一下concrt140.dll这个文件&#xff0c;以及我们要怎么去解决concrt140.dll文件丢失的问题。下…

hnust 1817 算法10-10,10-11:堆排序

hnust 1817 算法10-10,10-11&#xff1a;堆排序 题目描述 堆排序是一种利用堆结构进行排序的方法&#xff0c;它只需要一个记录大小的辅助空间&#xff0c;每个待排序的记录仅需要占用一个存储空间。 首先建立小根堆或大根堆&#xff0c;然后通过利用堆的性质即堆顶的元素是最…

pppd 返回错误码 含义

错误码 00&#xff1a; pppd已经断开&#xff0c;或者已经成功建立连接后请求方又中 断了。 01&#xff1a; 发成了一个严重错误&#xff0c;例如系统调用失败或者访问非法内存。 02&#xff1a; 处理给定操作是检测到错误&#xff0c;例如使用两个互斥的操作。 03&#xff1a;…

如何获取Power BI的个性可视化控件?

我们在使用Power BI Desktop自带可视化控件进行报表设计的时候&#xff0c;有的时候会发现自带控件使用起来略显单薄&#xff0c;需要一些更有创意或者更能直接吸人眼球的可视化控件。 那有没有地方可以让我们找到一些个性化控件呢&#xff1f; 答案是肯定的&#xff0c;目前P…

vscode 安装Vue插件

打开扩展面板 --> 点击左侧的扩展图标&#xff0c;或者按下快捷键 Ctrl Shift X 搜索插件,在搜索框中输入 Vue vue-helper 用来快捷提示&#xff0c;如果使用elementui的话&#xff0c;插件不会自动提示&#xff0c;安装了它&#xff0c;组件、属性都会有提示了 Vetur V…

嵌入式Linux系统编程 — 4.1 字符串输入输出

目录 1 字符串输出 1.1 字符串输出函数简介 1.2 示例程序 2 字符串输入 2.1 字符串输入简介 2.2 示例程序 程序运行时&#xff0c;需打印信息至标准输出 stdout 设备 或标准错误 stderr设备&#xff08;譬如屏幕&#xff09;&#xff0c;如调试信息、报错信息、中间产生的…

Java | Leetcode Java题解之第202题快乐数

题目&#xff1a; 题解&#xff1a; class Solution {private static Set<Integer> cycleMembers new HashSet<>(Arrays.asList(4, 16, 37, 58, 89, 145, 42, 20));public int getNext(int n) {int totalSum 0;while (n > 0) {int d n % 10;n n / 10;totalS…

枫清科技创始人高雪峰:不取侥幸之利,做难而正确的事!丨数据猿专访

大数据产业创新服务媒体 ——聚焦数据 改变商业 金庸有一本著作叫做《侠客行》&#xff0c;这部武侠小说的主角叫做石破天&#xff0c;他从小的时候便跟随少林弟子习武。长大后&#xff0c;随着自己获得的感悟越来越多&#xff0c;最终选择开宗立派&#xff0c;独创一门武功行…

碧海威L7云路由无线运营版 confirm.php/jumper.php 命令注入漏洞复现(XVE-2024-15716)

0x01 产品简介 碧海威L7网络设备是 北京智慧云巅科技有限公司下的产品,基于国产化ARM硬件平台,采用软硬一体协同设计方案,释放出产品最大效能,具有高性能,高扩展,产品性能强劲,具备万兆吞吐能力,支持上万用户同时在线等高性能。其采用简单清晰的可视化WEB管理界面,支持…

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

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

交易例子----qmt实盘分钟交易例子,提供交易源代码

今天给大家一个利用qmt_trader交易策略&#xff0c;我现在实盘使用的系统是自己开发的&#xff0c;只需要把qmt_trader当中第三方库使用就可以&#xff0c;源代码开源开源直接下载 量化系统--开源强大的qmt交易系统&#xff0c;提供源代码 参考教程使用&#xff0c;下载当第三…

ONLYOFFICE桌面编辑器8.1版:个性化编辑和功能强化的全面升级

ONLYOFFICE是一款全面的办公套件&#xff0c;由Ascensio System SIA开发。该软件提供了一系列与微软Office系列产品相似的办公工具&#xff0c;包括处理文档&#xff08;ONLYOFFICE Document Editor&#xff09;、电子表格&#xff08;ONLYOFFICE Spreadsheet Editor&#xff0…

Ubuntu Nvidia GPU驱动安装和故障排除

去官网 菜单列表下载&#xff0c;或者直接下载驱动 wget https://cn.download.nvidia.com/XFree86/Linux-x86_64/550.54.14/NVIDIA-Linux-x86_64-550.54.14.run 安装驱动 /data/install/NVIDIA-Linux-x86_64-550.54.14.run 执行命令&#xff0c;显示GPU情况 出错处理&…