You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java Stream API简化指定的Map过滤与列表生成逻辑?

当然可以用Java Stream API简化这段代码!作为Stream新手,咱们可以把嵌套的if-else逻辑转成更流畅的链式调用,既保留原逻辑,又让代码更清爽。

先上重构后的完整代码:

import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.Optional;
import java.util.stream.Collectors;

// 假设stats是Map<String, Object>类型(因为它既存储List<String>又存储Map<String, String>)
List<String> roles = Optional.ofNullable(stats.get("roles"))
    // 如果stats的泛型是明确的,这里的类型转换可以省略,否则需要强转成List<String>
    .map(List.class::cast)
    .orElseGet(() -> 
        Optional.ofNullable((Map<String, String>) stats.get("attributes"))
            // 没有attributes键时,用空HashMap兜底
            .orElse(new HashMap<>())
            .entrySet()
            .stream()
            // 筛选值为"true"的条目,常量放前面避免空指针
            .filter(entry -> "true".equals(entry.getValue()))
            // 提取符合条件的键
            .map(Map.Entry::getKey)
            // 收集成最终的List
            .collect(Collectors.toList())
    );

一步步解释逻辑:

  1. 优先拿"roles"列表:用Optional.ofNullable包装stats.get("roles"),安全处理键不存在的情况(不用写if判null)。如果"roles"存在,就直接转成List<String>返回。
  2. 处理"attributes"分支:当"roles"不存在时,orElseGet会执行后面的逻辑:
    • 同样用Optional.ofNullable处理"attributes",如果这个键也没有,就返回空的HashMap,避免后续遍历出问题。
    • 把Map的条目转成Stream,用filter挑出值等于"true"的条目(把"true"放前面,就算entry的值是null也不会抛空指针)。
    • 用map把每个符合条件的条目转成它的key。
    • 最后用collect把这些key收集成List。

测试你的示例:

当输入是{"attributes":{"id":"false","name":"true"}}(注意原代码里值是字符串类型,所以示例里的布尔值其实是字符串"true"/"false"),这段代码会正确输出["name"],和你预期的结果一致。

要是你后续需要处理布尔值类型的value,只需要把filter改成filter(entry -> Boolean.TRUE.equals(entry.getValue()))就行,灵活性很强~

内容的提问来源于stack exchange,提问作者Bhavya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 10:47:28