2017-09-03 3 views
1

Considérons le code suivant. J'ai lu qu'il est important d'obtenir l'immuabilité dans le code tout en traitant avec l'API Stream. Comment pouvons-nous obtenir une liste de tous les éléments en minuscules avec l'immuabilité?comment réaliser l'immuabilité dans Java 8 stream api

List<String> stockList = Arrays.asList("GOOG", "AAPL", "MSFT", "INTC"); 
    List<String> stockList2 = new ArrayList<>(); 
    stockList.parallelStream() 
      .filter(e -> !e.contains("M")) 
      .map(String::toLowerCase) 
      .map(e -> stockList2.add(e)) 
      .collect(toList()); 
    stockList2.forEach(System.out::println); 
+0

La chaîne est déjà immuable, donc vous êtes couvert ici la liste stockList2 contient de nouvelles chaînes créées à partir des chaînes de stockList – urag

+1

pas ce que vous avez demandé mais généralement vous devriez utiliser ParallelStream avec prudence (dans les cas simples, les frais généraux seront supérieurs au bénéfice –

+3

Ce que vous entendez par immuabilité dans ce contexte n'est pas clair. Précisez s'il vous plaît. – shmosel

Répondre

14

Vous ne devriez pas utiliser map() pour ajouter des éléments à un List. map() est censé transformer un Stream d'éléments d'un type en Stream d'éléments d'un autre type.

Utilisez le List retourné par collect(Collectors.toList()):

List<String> stockList2 = 
    stockList.stream() 
      .filter(e -> !e.contains("M")) 
      .map(String::toLowerCase) 
      .collect(Collectors.toList()); 
stockList2.forEach(System.out::println); 

Vous n'êtes pas muter tous les objets. Les String s sont déjà immuables (toLowerCase produit un nouveau String si nécessaire) et l'original List (stockList) n'est pas muté par la création de la sortie List (stockList2).