Java8替代if else:Map中List<Object>类型变量的取值问题
用Java 8特性替代if-else处理Map中双List的真实值判断
嘿,这个场景用Java 8的特性来替代冗余的if-else逻辑简直太合适了!我来给你分享两种简洁的实现方式,完全贴合你的需求:
先明确核心逻辑
我们的目标是从attributesMap中取出"value"和"values"对应的List<Object>,其中只有一个列表持有真实业务值,另一个是默认的[0](非实际值)。我们需要跳过默认值,直接拿到那个真实的列表。
方式一:用Optional链式调用(最直观,适合固定两个键的场景)
这种方式利用Optional的filter和orElseGet方法,实现类似"先检查A,符合就用A,否则用B"的逻辑,完全去掉分支:
// 先定义判断是否为真实值的辅助方法(根据你的实际规则调整) private boolean isRealValue(List<Object> list) { // 假设默认值是仅包含一个Integer类型0的列表,真实值不满足这个条件 return list != null && !list.isEmpty() && !(list.size() == 1 && Objects.equals(list.get(0), 0)); } // 核心逻辑一行搞定 List<Object> realValueList = Optional.ofNullable(attributesMap.get("value")) .filter(this::isRealValue) .orElseGet(() -> attributesMap.get("values"));
方式二:用Stream流处理(更灵活,适合后续可能扩展更多候选键的场景)
如果以后可能需要增加更多类似的候选键,用Stream来遍历过滤会更易维护:
// 同样用上面的isRealValue方法判断 List<Object> realValueList = Stream.of("value", "values") .map(attributesMap::get) // 按键从Map中取出对应的List .filter(this::isRealValue) // 过滤掉默认值的列表 .findFirst() // 拿到第一个符合条件的真实值列表(因为你说只有一个) .orElseThrow(() -> new IllegalArgumentException("未找到有效真实值列表"));
关键注意点
- 一定要根据你的实际默认值规则调整
isRealValue方法的判断逻辑:比如如果默认值是列表里全是0,或者列表长度为0,都要对应修改条件。 - 如果能确保两个列表中必有一个是真实值,
orElseThrow可以换成orElse(比如兜底返回空列表),但用orElseThrow能更早发现异常情况。
内容的提问来源于stack exchange,提问作者user1578872
相关产品推荐
相关产品推荐

