Java 8ストリームfindFirst()とfindAny()

1.はじめに

Java 8 Stream APIでは、誤解されがちな2つのメソッドfindAny()findFirst()が導入されました。

このクイックチュートリアルでは、これら2つの方法の違いとそれらをいつ使用するかを見ていきます。

2. Stream.findAny()を使用する

名前が示すように、findAny()メソッドを使用すると、Streamから任意の要素を検索できます。遭遇順序に注意を払わずに要素を探しているときに使用します。

このメソッドは、ストリームが空の場合は空のオプションのインスタンスを返します。

@Test public void createStream_whenFindAnyResultIsPresent_thenCorrect() { List list = Arrays.asList("A","B","C","D"); Optional result = list.stream().findAny(); assertTrue(result.isPresent()); assertThat(result.get(), anyOf(is("A"), is("B"), is("C"), is("D"))); }

非並列操作では、ストリームの最初の要素が返される可能性がありますが、これは保証されません

並列操作を処理するときに最大のパフォーマンスを得るには、結果を確実に判断することはできません。

@Test public void createParallelStream_whenFindAnyResultIsPresent_thenCorrect()() { List list = Arrays.asList(1, 2, 3, 4, 5); Optional result = list .stream().parallel() .filter(num -> num < 4).findAny(); assertTrue(result.isPresent()); assertThat(result.get(), anyOf(is(1), is(2), is(3))); }

3. Stream.findFirst()を使用する

関数は、FindFirst()メソッドは、最初の要素見つけストリームを。明らかに、このメソッドは、シーケンスの最初の要素が特に必要な場合に使用されます。

遭遇順序がない場合、ストリームから要素を返します。java.util.streamsのパッケージのドキュメントは言います:

ストリームには、定義された遭遇順序がある場合とない場合があります。ソースと中間操作によって異なります。

戻り値の型もオプションのインスタンスであり、ストリームも空の場合は空になります。

@Test public void createStream_whenFindFirstResultIsPresent_thenCorrect() { List list = Arrays.asList("A", "B", "C", "D"); Optional result = list.stream().findFirst(); assertTrue(result.isPresent()); assertThat(result.get(), is("A")); }

findFirstメソッドの動作は、並列シナリオでは変更されません。遭遇順序が存在する場合、それは常に決定論的に動作します。

4.結論

このチュートリアルでは、我々は見findAny()のFindFirst()のJava 8のストリームAPIの方法。findAny()メソッドから任意の要素を返すストリームながら関数は、FindFirst()メソッドは、最初の要素戻りストリームを

この記事の完全なソースコードとすべてのコードスニペットは、GitHubにあります。