允许空值时求多个Integer最大值的优雅实现方案问询
求解可空多个Integer的最大值的优雅实现
我想知道是否有比当前实现更简洁优雅的方法,来求解允许为空的多个Integer(如value1、value2、value3)的最大值。直接使用如下代码会抛出NullPointerException:
Math.max(Math.max(value1, value2), value3)我编写了如下分支判断代码,但它无法适配超过3个Integer的场景:
public Integer getMaxValue(Integer value1, Integer value2, Integer value3) { Integer defaultValue = 1; if (value1 == null && value2 == null && value3 == null) { return defaultValue; } else if (value1 == null && value2 != null && value3 != null) { return Math.max(value2, value3); } else if (value2 == null && value1 != null && value3 != null) { return Math.max(value1, value3); } else if (value3 == null && value1 != null && value2 != null) { return Math.max(value1, value2); } else if (value1 == null && value2 == null) { return value3; } else if (value2 == null && value3 == null) { return value1; } else if (value1 == null && value3 == null) { return value2; } else { return Math.max(Math.max(value1, value2), value3); } }
方法一:Java Stream API(推荐,扩展性强)
这种方案可以轻松支持任意数量的Integer参数,自动过滤null值,同时处理全null的默认值场景:
import java.util.Arrays; import java.util.Objects; public Integer getMaxValue(Integer... values) { Integer defaultValue = 1; return Arrays.stream(values) .filter(Objects::nonNull) // 过滤所有null元素 .max(Integer::compareTo) // 计算剩余元素的最大值 .orElse(defaultValue); // 全为null时返回默认值 }
说明:
- 用可变参数
Integer... values接收任意数量的输入; filter(Objects::nonNull)避免NullPointerException;max(Integer::compareTo)返回Optional<Integer>,空值时触发orElse返回默认值。
方法二:Optional遍历处理(无需Stream)
如果不想用Stream,也可以结合Optional安全遍历参数,实现同样的扩展能力:
import java.util.Optional; public Integer getMaxValue(Integer... values) { Integer defaultValue = 1; Integer currentMax = null; for (Integer val : values) { currentMax = Optional.ofNullable(currentMax) .map(max -> Optional.ofNullable(val) .map(v -> Math.max(max, v)) .orElse(max)) .orElse(val); } return Optional.ofNullable(currentMax).orElse(defaultValue); }
说明:
- 遍历所有参数,用Optional安全处理当前最大值和新值的比较;
- 初始
currentMax为null时,直接取第一个非null值作为初始最大值; - 最后判断
currentMax是否为null,全null时返回默认值。
方法三:Guava工具类(需引入第三方库)
如果项目已依赖Guava,可以用现成的工具类简化实现:
import com.google.common.primitives.Ints; import java.util.Arrays; import java.util.Objects; public Integer getMaxValue(Integer... values) { Integer defaultValue = 1; int[] nonNullInts = Arrays.stream(values) .filter(Objects::nonNull) .mapToInt(Integer::intValue) .toArray(); return nonNullInts.length == 0 ? defaultValue : Ints.max(nonNullInts); }
说明:
- 先过滤非null元素并转为int数组;
- 用Guava的
Ints.max()直接求数组最大值,空数组时返回默认值。
内容的提问来源于stack exchange,提问作者noob555
相关产品推荐
相关产品推荐

