查找列表或集合的最大/最小

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(value-> value)以獲取Integer流
  3. 在流上調用max()方法以獲取最大值
  4. 如果未從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);

 }

讓我們看一下這個邏輯:

  1. 在列表上調用stream()方法以從列表中獲取值流
  2. 在流上調用min()方法以獲取最小值。我們傳遞了一個lambda函數作為比較器,該函數用於確定用於確定最小值的排序邏輯
  3. 如果未從min ()接收到任何值,則調用orElseThrow()引發異常

4。結論

在這篇快速的文章中,我們探討瞭如何使用Java 8的Stream API中的max()min()方法從**列表/集合中查找最大值和最小值。**

與往常一樣,該代碼可在Github上使用