it-swarm.com.de

Lambda-Ausdruck zum Konvertieren von Array / String-Liste in Array / Integer-Liste

Da Java 8 mit leistungsstarken Lambda-Ausdrücken geliefert wird,

Ich möchte eine Funktion schreiben, um eine Liste/ein Array von Strings in ein Array/eine Liste von Ganzzahlen, Floats, Doubles usw. umzuwandeln.

In normalem Java wäre es so einfach wie

for(String str : strList){
   intList.add(Integer.valueOf(str));
}

Aber wie kann ich dasselbe mit einem Lambda erreichen, wenn ein Array von Strings in ein Array von Ganzzahlen konvertiert wird?.

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

Die Hilfsmethoden aus der akzeptierten Antwort werden nicht benötigt. Streams kann mit Lambdas verwendet oder normalerweise mit Method References gekürzt werden. Streams ermöglichen funktionale Operationen. map() konvertiert die Elemente und collect(...) oder toArray() verpackt den Stream wieder in ein Array oder eine Sammlung.

Venkat Subramaniam's Talk (Video) erklärt es besser als ich.

1 Konvertieren Sie List<String> In 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 Konvertieren Sie List<String> In int[]

int[] r2 = l1.stream().mapToInt(Integer::parseInt).toArray();

3 Konvertieren Sie String[] In List<Integer>

String[] a1 = {"4", "5", "6"};
List<Integer> r3 = Stream.of(a1).map(Integer::parseInt).collect(Collectors.toList());

4 Konvertieren Sie String[] In int[]

int[] r4 = Stream.of(a1).mapToInt(Integer::parseInt).toArray();

5 Konvertieren Sie String[] In List<Double>

List<Double> r5 = Stream.of(a1).map(Double::parseDouble).collect(Collectors.toList());

6 (Bonus) int[] In String[] Umrechnen

int[] a2 = {7, 8, 9};
String[] r6 = Arrays.stream(a2).mapToObj(Integer::toString).toArray(String[]::new);

Natürlich sind viel mehr Variationen möglich.

Siehe auch Ideone-Version dieser Beispiele . Kann auf Fork klicken und dann im Browser ausführen.

26
Stan Kurdziel

EDIT: Wie in den Kommentaren erwähnt, ist dies eine viel einfachere Version: Arrays.stream(stringArray).mapToInt(Integer::parseInt).toArray() Auf diese Weise können wir die gesamte Konvertierung in und aus einer Liste überspringen.


Ich habe eine andere einzeilige Lösung gefunden, aber sie ist immer noch ziemlich langsam (dauert ungefähr 100-mal länger als ein for-Zyklus - getestet auf einem Array von 6000 0).

String[] stringArray = ...
int[] out= Arrays.asList(stringArray).stream().map(Integer::parseInt).mapToInt(i->i).toArray();

Was dies bewirkt:

  1. Arrays.asList () konvertiert das Array in eine Liste
  2. .stream konvertiert es in einen Stream (benötigt um eine Map zu erstellen)
  3. .map (Integer :: parseInt) konvertiert alle Elemente im Stream in Ganzzahlen
  4. .mapToInt (i-> i) konvertiert alle Ganzzahlen in Ints (Sie müssen dies nicht tun, wenn Sie nur Ganzzahlen möchten)
  5. .toArray () konvertiert den Stream zurück in ein Array
7
Colander

Für Liste:

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

Für Array:

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

Sie können auch verwenden,

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

Ich habe es in den vorherigen Antworten nicht gefunden, also mit Java 8 und Streams:

Konvertieren String[] bis Integer[]:

Arrays.stream(stringArray).map(Integer::valueOf).toArray(Integer[]::new)
0
LeoLozes