Verwendung von Java 8 und wenn Sie nicht lieber eine List
Instanz selbst, wie in der vorgeschlagenen (und akzeptiert) Lösung
someMap.values().forEach(someList::addAll);
Man könnte es instanziiert tun alle von Streaming mit dieser Aussage:
List<String> someList = map.values().stream().flatMap(c -> c.stream()).collect(Collectors.toList());
Übrigens sollte es interessant sein zu wissen, dass auf Java 8 die akzeptierte Version in der Tat die schnellste ist. Es hat ungefähr das gleiche Timing wie ein
for (List<String> item : someMap.values()) ...
und ist viel schneller als die reine Streaming-Lösung. Hier ist mein kleiner Testcode. Ich benenne es ausdrücklich nicht als Benchmark, um die daraus resultierende Diskussion von Benchmark-Fehlern zu vermeiden. ;) Ich mache jeden Test zweimal, um hoffentlich eine vollständige kompilierte Version zu bekommen.
Map<String, List<String>> map = new HashMap<>();
long millis;
map.put("test", Arrays.asList("1", "2", "3", "4"));
map.put("test2", Arrays.asList("10", "20", "30", "40"));
map.put("test3", Arrays.asList("100", "200", "300", "400"));
int maxcounter = 1000000;
System.out.println("1 stream flatmap");
millis = System.currentTimeMillis();
for (int i = 0; i < maxcounter; i++) {
List<String> someList = map.values().stream().flatMap(c -> c.stream()).collect(Collectors.toList());
}
System.out.println(System.currentTimeMillis() - millis);
System.out.println("1 parallel stream flatmap");
millis = System.currentTimeMillis();
for (int i = 0; i < maxcounter; i++) {
List<String> someList = map.values().parallelStream().flatMap(c -> c.stream()).collect(Collectors.toList());
}
System.out.println(System.currentTimeMillis() - millis);
System.out.println("1 foreach");
millis = System.currentTimeMillis();
for (int i = 0; i < maxcounter; i++) {
List<String> mylist = new ArrayList<String>();
map.values().forEach(mylist::addAll);
}
System.out.println(System.currentTimeMillis() - millis);
System.out.println("1 for");
millis = System.currentTimeMillis();
for (int i = 0; i < maxcounter; i++) {
List<String> mylist = new ArrayList<String>();
for (List<String> item : map.values()) {
mylist.addAll(item);
}
}
System.out.println(System.currentTimeMillis() - millis);
System.out.println("2 stream flatmap");
millis = System.currentTimeMillis();
for (int i = 0; i < maxcounter; i++) {
List<String> someList = map.values().stream().flatMap(c -> c.stream()).collect(Collectors.toList());
}
System.out.println(System.currentTimeMillis() - millis);
System.out.println("2 parallel stream flatmap");
millis = System.currentTimeMillis();
for (int i = 0; i < maxcounter; i++) {
List<String> someList = map.values().parallelStream().flatMap(c -> c.stream()).collect(Collectors.toList());
}
System.out.println(System.currentTimeMillis() - millis);
System.out.println("2 foreach");
millis = System.currentTimeMillis();
for (int i = 0; i < maxcounter; i++) {
List<String> mylist = new ArrayList<String>();
map.values().forEach(mylist::addAll);
}
System.out.println(System.currentTimeMillis() - millis);
System.out.println("2 for");
millis = System.currentTimeMillis();
for (int i = 0; i < maxcounter; i++) {
List<String> mylist = new ArrayList<String>();
for (List<String> item : map.values()) {
mylist.addAll(item);
}
}
System.out.println(System.currentTimeMillis() - millis);
Und hier sind die Ergebnisse:
1 stream flatmap
468
1 parallel stream flatmap
1529
1 foreach
140
1 for
172
2 stream flatmap
296
2 parallel stream flatmap
1482
2 foreach
156
2 for
141
bearbeiten 2016.05.24 (zwei Jahre nach):
den gleichen Test Ausführen einer tatsächlichen Java 8 Version mit (U92) auf der gleichen Maschine:
1 stream flatmap
313
1 parallel stream flatmap
3257
1 foreach
109
1 for
141
2 stream flatmap
219
2 parallel stream flatmap
3830
2 foreach
125
2 for
140
Es scheint, dass es eine spee ist dup für die sequentielle Verarbeitung von Streams und einen noch größeren Overhead für parallele Streams.
Was ist mit der Verwendung einer Schleife falsch? –
@JoshM Nichts. Aber wenn ich etwas eingebautes verwenden kann, sollte ich. Normalerweise kenne ich die Antworten auf diese Art von Fragen, aber dieses Mal nicht, also dachte ich, ich würde fragen. –