方法定义

Long.sum(), Long.max(), Long.min()java.lang.Long 类提供的静态工具方法,用于对两个 long 值执行基本的算术和比较操作。

方法签名

// 计算两个 long 的和
public static long sum(long a, long b)

// 返回两个 long 中的最大值
public static long max(long a, long b)

// 返回两个 long 中的最小值
public static long min(long a, long b)
  • 参数a, b - 要操作的 long
  • 返回值sum 返回和,max/min 返回较大/较小值
  • 异常:无(但 sum 可能溢出)

功能说明

方法 功能
sum(long a, long b) 返回 a + b
max(long a, long b) 返回 ab 中的较大值
min(long a, long b) 返回 ab 中的较小值

💡 设计目的: 这些方法主要为支持 Java 8+ 的 Stream API 而设计,可作为方法引用传递给聚合操作(如 reducecollect)。


示例代码

1. 基本使用

long a = 100L;
long b = 200L;

System.out.println(Long.sum(a, b));   // 300
System.out.println(Long.max(a, b));   // 200
System.out.println(Long.min(a, b));   // 100

// 负数
System.out.println(Long.max(-10L, -5L));  // -5
System.out.println(Long.min(-10L, -5L));  // -10

2. 与 Stream API 结合(核心用途)

import java.util.Arrays;

long[] numbers = {1L, 5L, 3L, 9L, 2L};

// 求和
long sum = Arrays.stream(numbers)
                .reduce(0L, Long::sum);
System.out.println("Sum: " + sum); // 20

// 或使用 sum() 终端操作(更简单)
long sum2 = Arrays.stream(numbers).sum(); // 推荐用于求和

// 求最大值
long max = Arrays.stream(numbers)
                 .reduce(Long.MIN_VALUE, Long::max);
System.out.println("Max: " + max); // 9

// 求最小值
long min = Arrays.stream(numbers)
                 .reduce(Long.MAX_VALUE, Long::min);
System.out.println("Min: " + min); // 1

3. 在 collect 中使用

// 使用自定义收集器(较少见)
long result = Arrays.stream(numbers)
                   .boxed()
                   .collect(Collectors.reducing(0L, Long::sum));

使用技巧

✅ 技巧1:作为方法引用传递

// 在 reduce 中使用
OptionalLong maxOpt = Arrays.stream(numbers).reduce(Long::max);
OptionalLong minOpt = Arrays.stream(numbers).reduce(Long::min);

✅ 技巧2:与 BinaryOperator 配合

BinaryOperator<Long> sumOp = Long::sum;
BinaryOperator<Long> maxOp = Long::max;
BinaryOperator<Long> minOp = Long::min;

System.out.println(sumOp.apply(10L, 20L)); // 30

✅ 技巧3:处理空流的安全方式

long[] empty = {};

long max = Arrays.stream(empty)
                 .reduce(Long.MIN_VALUE, Long::max);
// 如果流为空,返回 Long.MIN_VALUE
System.out.println(max); // -9223372036854775808

⚠️ 注意:使用 reduce(identity, Long::max) 时,若流为空,会返回 identity(如 Long.MIN_VALUE),可能不符合预期。


常见错误

❌ 错误1:误以为 sum 会防止溢出

long a = Long.MAX_VALUE;
long b = 1L;

long result = Long.sum(a, b); 
System.out.println(result); // -9223372036854775808 (溢出!)

// 错误:以为 sum 会抛异常或返回安全值
// 正确:`Long.sum(a, b)` 等价于 `a + b`,会溢出

正确做法:需要检查溢出时使用 Math.addExact()

try {
    long safeSum = Math.addExact(a, b);
} catch (ArithmeticException e) {
    // 处理溢出
}

❌ 错误2:混淆 max/mincompare

// 错误:以为 max 返回 1/-1/0
int cmp = Long.max(a, b); // 错误!max 返回值,不是比较结果

// 正确比较
int comparison = Long.compare(a, b); // 返回 -1, 0, 1

❌ 错误3:在非 Stream 场景过度使用

// 不推荐:直接写 +, >, < 更清晰
long total = Long.sum(x, Long.sum(y, z));
long bigger = Long.max(a, b);

// 推荐
long total = x + y + z;
long bigger = a > b ? a : b;

注意事项

  1. 无溢出检查Long.sum(a, b) 等同于 a + b,会发生溢出。
  2. Stream 专用设计:这些方法主要为 reduce 操作设计,普通代码中直接使用 +>< 更高效、清晰。
  3. 性能:方法本身开销极小,但函数调用比直接操作符稍慢。
  4. 线程安全:静态方法,无状态,线程安全。
  5. 返回值max/min 返回原始值,不创建新对象。

最佳实践与性能优化

场景 推荐做法
Stream 中聚合 stream.reduce(0L, Long::sum)stream.mapToLong(...).sum()
求最大值 stream.max(Long::compare).orElse(defaultValue)
普通代码求和 直接使用 a + b
需要溢出检查 使用 Math.addExact(a, b)
性能敏感代码 避免不必要的方法调用

🔧 性能建议

  • Stream 操作中使用 Long::sum 等方法是标准且高效的。
  • 普通代码中,直接使用操作符(+, >, <)性能更好,代码更易读。
  • JVM 会内联这些简单方法,性能差异通常可忽略。

底层原理简析

这些方法的实现非常简单:

public static long sum(long a, long b) {
    return a + b;
}

public static long max(long a, long b) {
    return a >= b ? a : b;
}

public static long min(long a, long b) {
    return a <= b ? a : b;
}

它们的存在主要是为了提供函数式接口兼容的方法引用


与其他方法对比

方法 用途 替代方案
Long.sum(a,b) Stream 求和 a + b, Math.addExact()
Long.max(a,b) Stream 取最大 Math.max(a,b), 三元运算符
Long.min(a,b) Stream 取最小 Math.min(a,b), 三元运算符

🔍 注意:Math.max/min 也有 long 重载,功能相同。


总结

项目 说明
核心功能 提供 long 值的 summaxmin 操作
关键价值 支持 Stream API 的方法引用(如 reduce
典型用途 stream.reduce(identity, Long::sum)
优点 语义清晰、与函数式编程集成良好
缺点 普通代码中使用冗余,sum 无溢出检查
性能 ⭐⭐⭐⭐☆ 良好(Stream 场景推荐)

💡 一句话掌握
Long.sum()max()min() 主要用于 Java 8+ Stream 的 reduce 操作
stream.reduce(0L, Long::sum)
在普通代码中应直接使用 +Math.max 等操作符或方法。