原创

从Collection或者List中查找最大/最小值(对象)

1. 介绍‎
‎如何通过 Java8 中强大的‎‎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() ‎‎以获取整数流‎
  3. ‎在流上调用‎‎ max() ‎‎方法以获得最大值‎
  4. ‎如果没有从最大值收到,则调用‎‎ orElseXrow() ‎‎抛出一个异常
    3. 查找自定义对象的最小值
    为了查找自定义对象上最小/最大值,我们可以通过对lambda 表达式编写排序逻辑来实现。‎

    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 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() ‎方法以获得最低值。我们正在传递一个lamda函数作为比较器,这是用来决定最低值的排序逻辑‎
  3. ‎如果从 min() 未收到任何值,则调用‎ orElseThrow ‎‎抛出一个异常
    4.结尾
    ‎在这篇快速文章中,我们探讨了如何使用 Java 8‎‎ 的 Stream API ‎‎中的 max() ‎‎和‎ min() ‎方法‎‎从‎‎列表/集合‎‎中查找最大值和最小值。‎
正文到此结束
本文目录