web-dev-qa-db-fra.com

En utilisant les fonctionnalités de Java 8, quel est le moyen le plus concis de transformer toutes les valeurs d’une liste?

En utilisant les nouvelles fonctionnalités de Java 8, quel est le moyen le plus concis de transformer toutes les valeurs d’un List<String>?

Compte tenu de ceci:

List<String> words = Arrays.asList("Apple", "Ananas", "Mango", "Banana", "Beer");

Je fais actuellement ceci:

for (int n = 0; n < words.size(); n++) {
    words.set(n, words.get(n).toUpperCase());
}

Comment la nouvelle API Lambdas, Collections and Streams de Java 8 peut-elle aider:

  1. transformer les valeurs sur place (sans créer une nouvelle liste) 

  2. transformer les valeurs en une nouvelle liste de résultats.

12
The Coordinator

Voici ce que je suis venu avec:

Compte tenu de la liste:

List<String> keywords = Arrays.asList("Apple", "Ananas", "Mango", "Banana", "Beer");

(1) les transformer en place

Peut-être me manque-t-il, il ne semble pas y avoir de méthode 'apply' ou 'compute' qui prend un lambda pour List. Donc, c'est la même chose qu'avec l'ancien Java. Je ne peux pas penser à un moyen plus concis ou efficace avec Java 8. 

for (int n = 0; n < keywords.size(); n++) {
    keywords.set(n, keywords.get(n).toUpperCase());
}

Bien qu'il existe ce moyen qui n'est pas meilleur que la boucle for (..):

IntStream.range(0,keywords.size())
    .forEach( i -> keywords.set(i, keywords.get(i).toUpperCase()));

(2) transformer et créer une nouvelle liste

List<String> changed = keywords.stream()
    .map( it -> it.toUpperCase() ).collect(Collectors.toList());
42
The Coordinator

Peut-être en utilisant le nouveau concept de flux dans les collections:

List<String> keywords = Arrays.asList("Apple", "Ananas", "Mango", "Banana", "Beer");
//(1)
keywords = keywords.stream().map(s -> s.toUpperCase()).collect(Collectors.toList());
//(2)
List<String> uppercaseKeywords = keywords.stream().map(s -> s.toUpperCase()).collect(Collectors.toList());
0
jsrmalvarez