Java stream map et collect-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 MyObject
dans nameList
soit toujours le même que l'ordre de myList
?
33
Author: Lahiru Chandima, 2015-05-15
1 answers
Oui, vous pouvez vous attendre à cela même si vous utilisez parallel stream tant que vous ne l'avez pas converti explicitement en unordered()
mode.
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 mettez explicitement en mode non ordonné via
unordered()
appelez - Si la source du flux signale qu'il n'est pas ordonné (par exemple,
HashSet
le flux est non ordonné car l'ordre dépend de l'implémentation et vous ne peut pas compter sur elle) - 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é commetoSet()
)
Dans votre cas, aucune de ces conditions n'est remplie, votre flux est donc ordonné.
42
Author: Tagir Valeev, 2015-05-15 11:49:03