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)以获取Integer Stream
- 在流上调用max()方法以获取最大值
- 如果没有从max()接收到值,则调用orElseThrow()抛出异常
3. 使用自定义对象查找最小值
为了获取自定义对象的最小值/最大值,我们还可以为我们首选的排序逻辑提供一个Lambda表达式。
让我们首先定义自定义POJO:
class Person {
String name;
Integer age;
// standard constructors, getters and setters
}
我们想找到年龄最小的Person对象:
@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函数作为比较器,这用于决定最小值的排序逻辑。
- 如果没有从min()接收到值,则调用orElseThrow()抛出异常
4. 总结
在这篇简短的文章中,我们探讨了如何使用Java 8 Stream API中的max()和min()方法从List或Collection中查找最大值和最小值。
与往常一样,本教程的完整源代码可在GitHub上获得。
Show Disqus Comments
Post Directory
扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章