Java 8 Stream findFirst () contre findAny ()

Java 8 Stream findFirst () vs. findAny ()

1. introduction

L'API Java 8Stream a introduit deux méthodes souvent mal comprises:findAny() etfindFirst().

Dans ce rapide tutoriel, nous examinerons la différence entre ces deux méthodes et le moment de les utiliser.

Lectures complémentaires:

Filtrage d'un flux d'options en Java

Un guide rapide et pratique sur le filtrage des flux d’optionnels en Java 8 et Java 9

Read more

Flux de type primitif en Java 8

Guide rapide et pratique sur l'utilisation de Java 8 Stream avec des types primitifs.

Read more

Itératif pour diffuser en Java

L'article explique comment convertir un Iterable en Stream et pourquoi l'interface Iterable ne le prend pas directement en charge.

Read more

2. Utilisation desStream.findAny()

Comme son nom l'indique, la méthodefindAny() vous permet de trouver n'importe quel élément d'unStream. Utilisez-le lorsque vous recherchez un élément sans faire attention à l'ordre de rencontre:

La méthode renvoie une instance deOptional qui est vide si leStream est vide:

@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")));
}

Dans une opération non parallèle,it will most likely return the first element in the Stream but there is no guarantee for this.

Pour des performances maximales lors du traitement de l'opération en parallèle, le résultat ne peut pas être déterminé de manière fiable:

@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. Utilisation desStream.findFirst()

La méthodefindFirst() trouve le premier élément dans unStream. Evidemment, cette méthode est utilisée lorsque vous voulez spécifiquement le premier élément d'une séquence.

Lorsqu'il n'y a pas d'ordre de rencontre, il renvoie n'importe quel élément desStream. La documentation du paquetjava.util.streams dit:

Les flux peuvent avoir ou non unencounter order défini. Cela dépend de la source et des opérations intermédiaires.

Le type de retour est également une instanceOptional qui est vide si leStream est vide aussi:

@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"));
}

Le comportement de la méthodefindFirst ne change pas dans le scénario parallèle. Si l'ordre des rencontres existe, il se comportera toujours de manière déterministe.

4. Conclusion

Dans ce didacticiel, nous avons examiné les méthodesfindAny() etfindFirst() de l'API Java 8 Streams. La méthodefindAny() renvoie n'importe quel élément d'unStream tandis que la méthodefindFirst() renvoie le premier élément d'unStream.

Vous pouvez trouver le code source complet et tous les extraits de code pour cet articleover on GitHub.