Java中使用lamda表达式进行foreach,优雅处理集合List为null的情况

本文主要是介绍Java中使用lamda表达式进行foreach,优雅处理集合List为null的情况,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Java中使用lamda表达式进行foreach,优雅处理集合List为null的情况

一:举例方法

在使用Java 8及以上版本的Stream API时,如果你想要优雅地处理可能为空的List,可以使用以下方法

1、提前检查

在调用stream之前,先检查list是否为空或null。这是最直接的方法,可以避免调用stream的开销。

List<String> list = null;if (list != null && !list.isEmpty()) {list.stream().forEach(item -> {// 处理每一个item});
} else {// 处理空或null的list
}

2、Optional + Stream

使用Optional来封装可能为null的List,然后使用flatMap将其转换为一个空的Stream或List的Stream。

        Optional.ofNullable(list1)// 如果list1非空,应用List::stream方法,如果list为空,map不做任何操作.map(List::stream)// 如果list1为空,提供一个空的Stream.orElseGet(Stream::empty).forEach(item -> {// 处理每一个itemSystem.out.println(item);});

这段代码是Java中用于处理可能为空或非空的List对象的方式,旨在以函数式风格避免出现NullPointerException。下面分步解释这段代码的含义:

  1. Optional.ofNullable(list1): 这将list1包装在一个Optional对象中。如果list1null,那么得到的Optional对象将是空的。
  2. .map(List::stream): 这一步尝试将Optional中的list1转换为一个流(Stream)。如果list1是非空的,map操作将会应用传入的lambda表达式或方法引用(这里是List::stream),从而将列表转化为一个流。如果list1是空的,map操作不会做任何事情,Optional仍然为空。
  3. .orElseGet(Stream::empty): 如果前面的Optional是空的(这意味着list1null或者map操作没有执行因为Optional是空的),orElseGet方法会被调用并执行其参数(方法引用Stream::empty),该方法返回一个空的流。因此,无论list1是否为null,这一步都保证了一个流(Stream)会被返回,而不是null
  4. .forEach(item -> { ... }): 这是终端操作,会对前面步骤生成的流中的每个元素执行括号内的代码块。这里的代码块只是打印每个元素的内容。

简单来说,这段代码的作用是,无论list1是否为null或者为空列表,都能安全地对其元素进行遍历操作,而不会引发NullPointerException。如果list1为空或为null,流操作简单地不会执行任何操作,因为它会是一个空的流。

这种方法的好处在于,它不要求先检查list是否为null或空,代码更加简洁,并且在list为null时不会抛出NullPointerException。

3、Collection工具类

如果你可以使用Apache Commons Collections或Guava库,它们提供的工具类可以帮助处理null的情况。

使用Apache Commons Collections:

CollectionUtils.emptyIfNull(list).forEach(item -> {// 处理每一个item
});

使用Guava:

Iterables.emptyIfNull(list).forEach(item -> {// 处理每一个item
});

这两个方法都会安全地处理null值,如果list为null,它们会返回一个空的集合,这样就可以安全地进行迭代操作而不担心NullPointerException。

二:Optional + Stream和CollectionUtils性能比较

在这两种方式中,第二种方法使用Apache Commons Collections的CollectionUtils.emptyIfNull可能会更高效,原因如下:

  1. 简洁性CollectionUtils.emptyIfNull直接返回原始集合或空集合,不涉及额外的包装和解包步骤。它是一个简单的条件检查,如果输入为null,则返回一个预先定义的空集合。
  2. 性能OptionalmaporElseGet方法会创建更多的对象和函数调用。虽然这种开销在现代JVM上通常很小,但在大量或高频的调用中可能变得显著。
  3. 直观性CollectionUtils.emptyIfNull的表达更加直观,它清晰地表达了操作的目的——如果集合为null,则使用一个空的集合替代。这使得代码的阅读者很容易理解代码的意图。

然而,实际上,性能差异可能是微不足道的,特别是对于小型或中等规模的集合。如果性能是一个关键考虑因素,你应该基于实际的应用场景进行基准测试。很多时候,代码的清晰性和维护性可能比微小的性能差异更为重要。

在现代Java版本中(特别是Java 9及更高),Optional和流的性能得到了大幅优化。因此,如果不是在极端性能敏感的环境下

选择哪个方法更多的是:基于代码风格和可读性的考虑,而不是基于性能

这篇关于Java中使用lamda表达式进行foreach,优雅处理集合List为null的情况的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/595502

相关文章

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一