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官方文档


原始标题:Finding Min/Max in an Array with Java