stream.filter不会空指针,stream.map会出现空指针

本文探讨了Java中Stream API的使用,特别是当映射操作可能返回空值时,如何通过提供默认值避免空指针异常。建议在使用map方法时结合MapUtils的getString方法,传入默认值以确保后续的findFirst等操作不会引发错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前者返回一个流对象,后者如果出来的值是空的,再.findfirst()等其他的方法就会出现空指针,所以最好给map的取值结果加个默认值,去stream.map(aa-> Maputils.getstring(aa,key,默认值))

<think>根据用户问题,用户希望了解在JavaStreamfilter方法中使用枚举类型作为布尔过滤条件的具体用法。结合提供的引用,特别是引用[1]中的示例,展示了如何使用Stream过滤枚举值。关键点:1.枚举类型定义:通常枚举包含多个常量,每个常量可能有属性(如status和remark)。2.Stream操作:将枚举数组转换为流,然后使用filter方法根据枚举的某个属性进行过滤。3.过滤条件:在filter中,可以使用一个返回布尔值的表达式(如lambda表达式),基于枚举实例的属性进行判断。示例步骤:-获取枚举的所有值:通过`枚举类.values()`得到枚举常量数组。-转换为流:使用`Arrays.stream()`或`Stream.of()`。-应用filter:传入一个Predicate(谓词),通常用lambda表达式,该表达式应返回布尔值,例如`e->e.getStatus()==某个值`。-后续操作:如`findFirst()`获取第一个匹配项,或`collect(Collectors.toList())`收集所有匹配项。用户提供的引用[1]中的代码已经是一个很好的例子:```javapublicstaticvoidmain(String[]args){Optional<StatusEnum>optional=Arrays.stream(StatusEnum.values()).filter(p->p.getStatus()==3)//这里使用枚举实例的getStatus()方法返回值与3比较,得到一个布尔值作为过滤条件.findFirst();//然后处理optional}```因此,我们可以这样总结:在filter方法中,传入的lambda表达式对枚举的每个实例进行求值,返回true的保留,false的过滤掉。为了更清晰,我们可以假设一个枚举定义:```javapublicenumStatusEnum{SUCCESS(1,"成功"),FAILURE(2,"失败"),PENDING(3,"处理中");privatefinalintstatus;privatefinalStringremark;StatusEnum(intstatus,Stringremark){this.status=status;this.remark=remark;}publicintgetStatus(){returnstatus;}publicStringgetRemark(){returnremark;}}```那么,使用Streamfilter过滤出状态为3的枚举常量:```javaOptional<StatusEnum>result=Arrays.stream(StatusEnum.values()).filter(statusEnum->statusEnum.getStatus()==3).findFirst();```如果过滤条件是基于枚举的某个布尔属性(比如枚举中有一个方法返回布尔值),则可以直接在filter中使用该方法。例如,假设枚举中有一个方法`isActive()`返回布尔值,那么可以这样:```javaList<StatusEnum>activeEnums=Arrays.stream(StatusEnum.values()).filter(StatusEnum::isActive)//方法引用,等价于e->e.isActive().collect(Collectors.toList());```所以,使用枚举作为布尔过滤条件,本质上就是在filter中根据枚举实例的某个属性(通过方法获取)或直接使用枚举实例的方法(返回布尔值)来编写条件。注意:枚举常量本身也可以直接用于条件判断,比如在filter中比较枚举常量(如`e==StatusEnum.SUCCESS`),但用户问题中强调的是“作为布尔过滤条件”,即根据枚举的属性或状态进行布尔判断。根据以上分析,回答用户问题。</think>### Java Stream filter 使用枚举作为布尔过滤条件的实现 在 Java Stream 的 `filter()` 方法中使用枚举作为布尔过滤条件,本质上是利用枚举的属性或方法构造返回布尔值的谓词(Predicate)。以下是具体实现方式和示例: #### 1. **基础实现方式** ```java // 定义枚举 public enum Status { ACTIVE(true, "激活"), INACTIVE(false, "未激活"), PENDING(true, "待处理"); private final boolean valid; private final String desc; Status(boolean valid, String desc) { this.valid = valid; this.desc = desc; } public boolean isValid() { return valid; // 返回布尔值的枚举方法 } } // 使用Stream过滤 List<Status> validStatuses = Arrays.stream(Status.values()) .filter(Status::isValid) // 关键:使用方法引用作为布尔过滤条件 .collect(Collectors.toList()); ``` - **核心机制**:`filter()` 接收 `Predicate<T>` 参数,枚举的布尔方法(如 `isValid()`)正好匹配此函数接口。 - **输出结果**:`[ACTIVE, PENDING]` #### 2. **带条件的动态过滤** ```java int targetCode = 2; List<Status> result = Arrays.stream(Status.values()) .filter(s -> s.isValid() && s.ordinal() > targetCode) // 组合条件 .collect(Collectors.toList()); ``` - 可结合枚举属性(`ordinal()`)、外部变量等构建复杂布尔逻辑。 #### 3. **查找特定枚举项** ```java Optional<Status> found = Arrays.stream(Status.values()) .filter(s -> "待处理".equals(s.getDesc())) // 基于属性过滤 .findFirst(); found.ifPresentOrElse( s -> System.out.println("找到: " + s), () -> System.out.println("未找到") ); ``` #### 4. **结合枚举映射** ```java Map<Boolean, List<Status>> partitioned = Arrays.stream(Status.values()) .collect(Collectors.partitioningBy(Status::isValid)); System.out.println(partitioned.get(true)); // 输出有效状态 ``` ### 关键要点 1. **布尔方法设计** 在枚举中定义返回 `boolean` 的方法(如 `isValid()`),这是最简洁的过滤条件来源[^1]。 2. **方法引用优势** 直接使用 `枚举类::方法名` 语法,比 Lambda 表达式 `e -> e.method()` 更简洁[^2]。 3. **空值安全** 使用 `Optional` 处理可能为空的过滤结果,避免 `NullPointerException`[^3]。 4. **性能考虑** 对少量枚举值,直接遍历数组效率足够;大量数据时可考虑预构建 `EnumSet` 优化。 > 示例引用: > [^1]: 枚举中定义布尔方法作为过滤条件来源。 > [^2]: 方法引用比Lambda表达式更简洁。 > [^3]: 使用Optional避免空指针异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老马识途2.0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值