リストやコレクションの最大値/最小値を見つける

リストまたはコレクションの最大/最小値を見つける

1. 前書き

Java8の強力なStream APIを使用して、特定のリスト/コレクションから最小/最大値を見つける方法の簡単な紹介。

2. 整数のリストで最大値を見つける

java.util.Streamインターフェースを介して提供されるmax()メソッドを使用できます。 メソッド参照を受け入れます。

@Test
public void whenListIsOfIntegerThenMaxCanBeDoneUsingIntegerComparator() {
    // given
    List 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. max()から値を受信しない場合に、orElseThrow()を呼び出して例外をスローする

3. カスタムオブジェクトで最小値を見つける

カスタムオブジェクトの最小/最大を見つけるために、優先ソートロジックのラムダ式を提供することもできます。

まず、カスタム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 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()メソッドを呼び出して、最小値を取得します。 ラムダ関数をコンパレータとして渡します。これは、最小値を決定するためのソートロジックを決定するために使用されます

  3. min()から値が受信されない場合に、orElseThrow()を呼び出して例外をスローします

4. 結論

この簡単な記事では、Java 8のStream APIのmax()メソッドとmin()メソッドをfind the maximum and minimum value from a List/Collection.に使用する方法について説明しました。

いつものように、コードはover on Githubで利用できます。