web-dev-qa-db-fra.com

Java carte de flux et collecte - ordre du conteneur résultant

List<MyObject> myList = new ArrayList<>(); 
//populate myList here

List<String> nameList = myList.stream()
        .map(MyObject::getName)
        .collect(Collectors.toList());

Dans le code ci-dessus, puis-je m'attendre à ce que l'ordre des noms de MyObject dans nameList soit toujours le même que l'ordre de myList?

41
Lahiru Chandima

Oui, vous pouvez vous y attendre même si vous utilisez un flux parallèle tant que vous ne l'avez pas explicitement converti en mode unordered() .

L'ordre ne change jamais en mode séquentiel, mais peut changer en mode parallèle. Le flux devient non ordonné soit:

  • Si vous le transformez explicitement en mode non ordonné via unordered() call
  • Si la source de flux indique qu'elle n'est pas ordonnée (par exemple, le flux HashSet n'est pas ordonné car l'ordre dépend de l'implémentation et vous ne pouvez pas vous y fier)
  • Si vous utilisez une opération de terminal non ordonnée (par exemple, une opération forEach() ou une collecte vers un collecteur non ordonné comme toSet())

Dans votre cas, aucune de ces conditions n'est remplie, votre flux est donc ordonné.

54
Tagir Valeev