Puisque Java 8 est livré avec de puissantes expressions lambda,
Je voudrais écrire une fonction pour convertir une liste/un tableau de chaînes en un tableau/une liste d'entiers, de flotteurs, de doubles, etc.
En Java normal, ce serait aussi simple que
for(String str : strList){
intList.add(Integer.valueOf(str));
}
Mais comment obtenir la même chose avec un lambda, étant donné qu'un tableau de chaînes doit être converti en un tableau d'entiers.
List<Integer> intList = strList.stream()
.map(Integer::valueOf)
.collect(Collectors.toList());
Les méthodes auxiliaires de la réponse acceptée ne sont pas nécessaires. Streams peut être utilisé avec lambdas ou généralement raccourci avec références de méthode . Les flux permettent des opérations fonctionnelles. map()
convertit les éléments et collect(...)
ou toArray()
convertit le flux dans un tableau ou une collection.
Le discours de Venkat Subramaniam (vidéo) l'explique mieux que moi.
1 Convertir List<String>
en List<Integer>
List<String> l1 = Arrays.asList("1", "2", "3");
List<Integer> r1 = l1.stream().map(Integer::parseInt).collect(Collectors.toList());
// the longer full lambda version:
List<Integer> r1 = l1.stream().map(s -> Integer.parseInt(s)).collect(Collectors.toList());
2 Convertir List<String>
en int[]
int[] r2 = l1.stream().mapToInt(Integer::parseInt).toArray();
3 Convertir String[]
en List<Integer>
String[] a1 = {"4", "5", "6"};
List<Integer> r3 = Stream.of(a1).map(Integer::parseInt).collect(Collectors.toList());
4 Convertir String[]
en int[]
int[] r4 = Stream.of(a1).mapToInt(Integer::parseInt).toArray();
5 Convertir String[]
en List<Double>
List<Double> r5 = Stream.of(a1).map(Double::parseDouble).collect(Collectors.toList());
6 (bonus) Convertir int[]
en String[]
int[] a2 = {7, 8, 9};
String[] r6 = Arrays.stream(a2).mapToObj(Integer::toString).toArray(String[]::new);
Bien plus de variations sont possibles bien sûr.
Voir aussi version Ideone de ces exemples . Peut cliquer sur fork puis s'exécuter dans le navigateur.
EDIT: Comme indiqué dans les commentaires, il s’agit d’une version beaucoup plus simple: Arrays.stream(stringArray).mapToInt(Integer::parseInt).toArray()
De cette manière, nous pouvons ignorer la conversion complète depuis et vers une liste.
J'ai trouvé une autre solution sur une ligne, mais elle reste assez lente (prend environ 100 fois plus de temps qu'un cycle - testé sur un tableau de 6000 0)
String[] stringArray = ...
int[] out= Arrays.asList(stringArray).stream().map(Integer::parseInt).mapToInt(i->i).toArray();
Qu'est-ce que cela fait:
pour liste:
List<Integer> intList
= stringList.stream().map(Integer::valueOf).collect(Collectors.toList());
pour tableau:
int[] intArray = Arrays.stream(stringArray).mapToInt(Integer::valueOf).toArray();
Vous pouvez aussi utiliser,
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
Integer[] array = list.stream()
.map( v -> Integer.valueOf(v))
.toArray(Integer[]::new);
Je ne l'ai pas trouvé dans les réponses précédentes, donc, avec Java 8 et les flux:
Convertir String[]
en Integer[]
:
Arrays.stream(stringArray).map(Integer::valueOf).toArray(Integer[]::new)