web-dev-qa-db-fra.com

Expression Lambda pour convertir un tableau / une liste de chaînes en un tableau / une liste d'entiers

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.

106
Reddy
List<Integer> intList = strList.stream()
                               .map(Integer::valueOf)
                               .collect(Collectors.toList());
118
ZehnVon12

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.

26
Stan Kurdziel

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:

  1. Arrays.asList () convertit le tableau en liste
  2. .stream le convertit en Stream (nécessaire pour réaliser une carte)
  3. .map (Integer :: parseInt) convertit tous les éléments du flux en Integers
  4. .mapToInt (i-> i) convertit tous les entiers en entiers (vous n'avez pas à le faire si vous voulez seulement des entiers)
  5. .toArray () reconvertit le Stream en tableau
7
Colander

pour liste:

List<Integer> intList 
 = stringList.stream().map(Integer::valueOf).collect(Collectors.toList());

pour tableau:

int[] intArray = Arrays.stream(stringArray).mapToInt(Integer::valueOf).toArray();
3
Sahil Chhabra

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);
2
user2182920

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)
0
LeoLozes