1前書き

この短いチュートリアルでは、Java 8の

Stream

APIを使用して、配列内の最大値と最小値を見つける方法を説明します。

まず整数の配列から最小値を見つけることから始め、次にオブジェクトの配列の最大値を見つけます。


2概要

順不同配列で最小値または最大値を見つける方法はたくさんありますが、それらはすべて次のようになります。

SET MAX to array[0]FOR i = 1 to array length - 1
  IF array[i]> MAX THEN
    SET MAX to array[i]  ENDIF
ENDFOR

  • Java 8がこれらの詳細をどのように私たちから隠すことができるかを見ていきます。しかし、JavaのAPIが適していない場合は、いつでもこの基本的なアルゴリズムに戻ることができます。

配列内の各値をチェックする必要があるので、すべての実装は

O(n)

です。


3最小の価値を見つける


  • java.util.stream.IntStream

    インターフェースは、

    min

    メソッドを提供します。

整数を扱うだけなので、

min

には

Comparator

は必要ありません。

@Test
public void whenArrayIsOfIntegerThenMinUsesIntegerComparator() {
    int[]integers = new int[]{ 20, 98, 12, 7, 35 };

    int min = Arrays.stream(integers)
      .min()
      .getAsInt();

    assertEquals(7, min);
}


Arrays



stream

staticメソッドを使用して

Integer

ストリームオブジェクトを作成したことに注目してください。各プリミティブ配列型に対応する

stream

メソッドがあります。

配列が空になる可能性があるので、

min



Optionalを返します。したがって、

int

に変換するには、

getAsInt__を使用します。


4最大のカスタムオブジェクトを見つける

簡単なPOJOを作成しましょう。

public class Car {
    private String model;
    private int topSpeed;

   //standard constructors, getters and setters
}

それから

Stream

APIを再び使用して、

__Car

__sの配列の中で最速の車を見つけることができます。

@Test
public void whenArrayIsOfCustomTypeThenMaxUsesCustomComparator() {
    Car porsche = new Car("Porsche 959", 319);
    Car ferrari = new Car("Ferrari 288 GTO", 303);
    Car bugatti = new Car("Bugatti Veyron 16.4 Super Sport", 415);
    Car mcLaren = new Car("McLaren F1", 355);
    Car[]fastCars = { porsche, ferrari, bugatti, mcLaren };

    Car maxBySpeed = Arrays.stream(fastCars)
      .max(Comparator.comparing(Car::getTopSpeed))
      .orElseThrow(NoSuchElementException::new);

    assertEquals(bugatti, maxBySpeed);
}

この場合、

Arrays

の静的メソッド

stream

は、インタフェース

java.util.stream.Stream <T>

のインスタンスを返します。メソッド

max

には

Comparator

** が必要です。

独自のカスタム

Comparator

を作成することもできますが、リンク:/java-8-コンパレータ – 比較[

Comparator.comparing

ははるかに簡単です。


max

が以前と同じ理由で

Optional

インスタンスを返すことに再度注意してください。

この値を

get

することも、

max

が値を返さない場合に例外をスローする

orElseThrow

のように、

__Optional

__sで他に可能なことをすべて行うこともできます。


5結論

この短い記事で、Java 8の

Stream

APIを使用して、配列上でmaxとminを見つけるのがいかに簡単でコンパクトかを見ました。

このライブラリの詳細については、https://docs.oracle.com/javase/8/docs/api/java/util/stream/packages-summary.html[Oracleのドキュメント]を参照してください。

これらすべての例とコードスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/core-java-8[GitHubに載って]を参照してください。