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);
}
让我们仔细看看代码:
- 在列表上调用
stream()
方法,获取列表中的值流。 - 在流上调用
mapToInt(value -> value)
,将流转换为整数流。 - 在流上调用
max()
方法,获取最大值。 - 使用
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);
}
以下是实现逻辑:
- 在列表上调用
stream()
方法,获取列表中的值流。 - 在流上调用
min()
方法,获取最小值。我们传递了一个lambda函数作为比较器,用于决定决定最小值的排序逻辑。 - 使用
orElseThrow()
方法,如果min()
没有接收到任何值,则抛出异常。
4. 总结
在本文中,我们探讨了Java 8流(Stream) API的max()
和min()
方法如何用于从列表/集合中找到最大值和最小值。
如往常一样,完整的代码可以在GitHub上查看。