方法定义
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) |
返回 a 和 b 中的较大值 |
min(long a, long b) |
返回 a 和 b 中的较小值 |
💡 设计目的: 这些方法主要为支持 Java 8+ 的 Stream API 而设计,可作为方法引用传递给聚合操作(如
reduce
、collect
)。
示例代码
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
/min
与 compare
// 错误:以为 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;
注意事项
- 无溢出检查:
Long.sum(a, b)
等同于a + b
,会发生溢出。 - Stream 专用设计:这些方法主要为
reduce
操作设计,普通代码中直接使用+
、>
、<
更高效、清晰。 - 性能:方法本身开销极小,但函数调用比直接操作符稍慢。
- 线程安全:静态方法,无状态,线程安全。
- 返回值:
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 值的 sum 、max 、min 操作 |
关键价值 | 支持 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
等操作符或方法。