如何用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()) );
一步步解释逻辑:
- 优先拿"roles"列表:用
Optional.ofNullable包装stats.get("roles"),安全处理键不存在的情况(不用写if判null)。如果"roles"存在,就直接转成List<String>返回。 - 处理"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
相关产品推荐
相关产品推荐

