1. 介绍
本文将演示如何使用Java 8的Stream API在数组中查找最大值和最小值。我们先从整数数组的最小值查找开始,然后扩展到对象数组的最大值查找。
2. 概述
在无序数组中查找最小/最大值的核心逻辑通常如下:
SET MAX to array[0]
FOR i = 1 to array length - 1
IF array[i] > MAX THEN
SET MAX to array[i]
ENDIF
ENDFOR
Java 8的Stream API能帮我们隐藏这些底层实现细节。但当标准API不适用时,我们随时可以回归基础算法。由于需要遍历所有元素,所有实现的时间复杂度都是 **O(n)**。
3. 查找最小值
java.util.stream.IntStream
提供的 min()
方法能完美解决整数数组的最小值问题:
@Test
public void whenArrayIsOfIntegerThenMinUsesIntegerComparator() {
int[] integers = new int[] { 20, 98, 12, 7, 35 };
int min = Arrays.stream(integers)
.min()
.getAsInt();
assertEquals(7, min);
}
关键点:
- 通过
Arrays.stream()
创建IntStream min()
返回OptionalInt
(⚠️ 处理空数组)- 用
getAsInt()
解包原始值
4. 查找自定义对象的最大值
先定义一个简单的POJO:
public class Car {
private String model;
private int topSpeed;
// 标准构造器、getter和setter
}
在Car数组中查找最高速的车辆:
@Test
public void whenArrayIsOfCustomTypeThenMaxUsesCustomComparator() {
Car porsche = new Car("Porsche 959", 319);
Car ferrari = new Car("Ferrari 288 GTO", 303);
Car bugatti = new Car("Bugatti Veyron 16.4 Super Sport", 415);
Car mcLaren = new Car("McLaren F1", 355);
Car[] fastCars = { porsche, ferrari, bugatti, mcLaren };
Car maxBySpeed = Arrays.stream(fastCars)
.max(Comparator.comparing(Car::getTopSpeed))
.orElseThrow(NoSuchElementException::new);
assertEquals(bugatti, maxBySpeed);
}
核心差异:
- 对象数组返回
Stream<T>
而非原始流 max()
需要指定Comparator
(✅ 推荐使用Comparator.comparing()
)- 处理Optional的两种方式:
get()
直接取值(可能抛出异常)orElseThrow()
自定义异常处理
5. 总结
通过Java 8 Stream API,数组的最小/最大值查找变得简洁高效。核心优势:
- 代码紧凑(单行完成核心逻辑)
- 类型安全(编译期检查)
- 灵活处理空值(Optional机制)
完整示例代码见 GitHub仓库
更多细节参考 Oracle官方文档