Java 8 Stream findFirst () contre findAny ()

1. Introduction

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

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

2. Utilisation de Stream.findAny ()

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

La méthode renvoie une instance facultative qui est vide si le Stream 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, il renverra très probablement le premier élément du Stream mais il n'y a aucune garantie pour cela .

Pour des performances maximales lors du traitement de l'opération 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 de Stream.findFirst ()

La méthode findFirst () recherche le premier élément d'un Stream. Évidemment, 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 du Stream . La documentation du package java.util.streams dit:

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

Le type de retour est également une instance facultative qui est vide si le flux est également vide:

@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éthode findFirst ne change pas dans le scénario parallèle. Si l'ordre de rencontre existe, il se comportera toujours de manière déterministe.

4. Conclusion

Dans ce didacticiel, nous avons examiné les méthodes findAny () et findFirst () de l'API Java 8 Streams. La méthode findAny () renvoie n'importe quel élément d'un Stream tandis que la méthode findFirst () renvoie le premier élément d'un Stream .

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