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

允许空值时求多个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:02:33