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?

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é comme toSet())

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