1. 概述

本篇文章将介绍如何使用Java 8的强大流(Stream) API 来从给定列表/集合中找到最小值和最大值。

2. 在整数列表中查找最大值

我们可以利用java.util.Stream接口提供的max()方法。它接受一个方法引用:

@Test
public void whenListIsOfIntegerThenMaxCanBeDoneUsingIntegerComparator() {
    // given
    List<Integer> listOfIntegers = Arrays.asList(1, 2, 3, 4, 56, 7, 89, 10);
    Integer expectedResult = 89;

    // then
    Integer max = listOfIntegers
      .stream()
      .mapToInt(v -> v)
      .max().orElseThrow(NoSuchElementException::new);

    assertEquals("Should be 89", expectedResult, max);
}

让我们仔细看看代码:

  1. 在列表上调用stream()方法,获取列表中的值流。
  2. 在流上调用mapToInt(value -> value),将流转换为整数流。
  3. 在流上调用max()方法,获取最大值。
  4. 使用orElseThrow()方法,如果max()没有接收到任何值,则抛出异常。

3. 在自定义对象列表中查找最小值

对于自定义对象,我们也可以提供一个lambda表达式来指定我们的排序逻辑。

首先,我们定义一个自定义POJO:

class Person {
    String name;
    Integer age;
      
    // standard constructors, getters and setters
}

我们想找到年龄最小的人:

@Test
public void whenListIsOfPersonObjectThenMinCanBeDoneUsingCustomComparatorThroughLambda() {
    // given
    Person alex = new Person("Alex", 23);
    Person john = new Person("John", 40);
    Person peter = new Person("Peter", 32);
    List<Person> people = Arrays.asList(alex, john, peter);

    // then
    Person minByAge = people
      .stream()
      .min(Comparator.comparing(Person::getAge))
      .orElseThrow(NoSuchElementException::new);

    assertEquals("Should be Alex", alex, minByAge);
}

以下是实现逻辑:

  1. 在列表上调用stream()方法,获取列表中的值流。
  2. 在流上调用min()方法,获取最小值。我们传递了一个lambda函数作为比较器,用于决定决定最小值的排序逻辑。
  3. 使用orElseThrow()方法,如果min()没有接收到任何值,则抛出异常。

4. 总结

在本文中,我们探讨了Java 8流(Stream) API的max()min()方法如何用于从列表/集合中找到最大值和最小值

如往常一样,完整的代码可以在GitHub上查看。


原始标题:Finding Max/Min of a List or Collection | Baeldung

» 下一篇: jOOL 库介绍