Java でリストをマップに変換する
java.util.stream
API は Java 8 で導入されました。オブジェクトのコレクションを処理するために使用されます。配列やコレクションなどのさまざまなソースでストリームを作成できます。
ここでは、findFirst()
および findAny()
ストリームメソッドとそれらをいつ使用するかを詳しく見ていきます。
Java 8 の findFirst()
ストリームメソッド
ストリームは元のデータを変更しません。パイプラインメソッドを使用してストリームの要素を評価します。
Stream API メソッド findFirst()
はターミナル操作です。終了して結果を返します。シーケンスの最初の要素が必要な場合は、findfFirst()
メソッドを使用します。
このメソッドは、ストリームの最初の要素を記述する Optional<T>
を返します。ここで、T
は String
であるタイプです。
Optional
はコンテナオブジェクトです。null 以外の値を保持する場合と保持しない場合があります。ストリームが空の場合、返される Optional
は空になります。
別のコンテキストで findFirst()
メソッドを使用して、それぞれ String
および Integer
タイプのデータを保持する fruits
および numbers
のリストを作成します。リスト要素のストリームを返すリストで .stream()
を呼び出します。
そのリストの最初の要素が必要なので、その上で findFirst()
メソッドを呼び出します。Optional
を返します。これは first
に保存されます。
Optional
インスタンスに値が含まれているかどうか、または boolean
を返す isPresent()
メソッドを使用していないかどうかを確認します。true が返された場合、値があり、first.get()
を使用して取得し、出力します。Optional
インスタンスが空の場合、値は出力されません。
2 番目のステートメント numbers.stream().filter((x)->x>5).findFirst()
は、2 番目の Optional
インスタンス firstN
を提供します。まず、filter()
メソッドを適用して、指定された述語に基づいてフィルター処理されたストリームを返します。
このメソッドは、5
より大きい値を持つ要素の新しいストリームを返します。そのストリームから、最初の要素を取得する必要があります。この場合、numbers
のストリームで 5
より大きい値を持つ最初の要素は 8
のみです。
import java.util.List;
import java.util.Optional;
public class StreamTest {
public static void main(String[] args) {
List<String> fruits = List.of("Apple", "Grapes", "Orange", "Kiwi");
List<Integer> numbers = List.of(4, 5, 3, 8);
Optional<String> first = fruits.stream().findFirst();
if (first.isPresent()) {
String string = first.get();
System.out.println("First String is : " + string);
} else {
System.out.println("No value");
}
Optional<Integer> firstN = numbers.stream().filter((x) -> x > 5).findFirst();
if (firstN.isPresent()) {
System.out.println("First Number is : " + firstN.get());
} else {
System.out.println("No value");
}
}
}
出力:
First String is : Apple
First Number is : 8
Java 8 の findAny()
ストリームメソッド
findAny()
メソッドは、ストリームの任意の要素を記述する Optional
インスタンスを返します。以下のプログラムには、Integer
型の要素のリストがあります。
リストからストリームを作成し、そのストリームをフィルタリングして、5
未満の値を持つ数値を返します。次に、findAny()
を呼び出して、フィルタリングされたストリームから任意の番号を取得します。
ほとんどの場合、最初の要素を返します。Optional
インスタンス firstN
が空でない場合、get()
メソッドを使用して取得したインスタンス値を出力します。
import java.util.List;
import java.util.Optional;
public class StreamTest {
public static void main(String[] args) {
List<Integer> numbers = List.of(4, 5, 2, 8);
Optional<Integer> firstN = numbers.stream().filter((x) -> x < 5).findAny();
if (firstN.isPresent()) {
System.out.println("Any First Number less then 5 is : " + firstN.get());
} else {
System.out.println("No value");
}
}
}
出力:
Any First Number less then 5 is : 4
シーケンシャルストリームとパラレルストリームの両方の場合、メソッド findAny()
および findFirst()
の動作は変更されないことに注意してください。非並列ストリームの場合の findAny()
の動作は保証されません。
Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn