O Map<K, List<V>>
içine List<V>
dönüştürmek kolaydır. Örneğin:Nasıl Java 8 akışları ve özel Listesi ve Harita tedarikçileri ile, Harita <K, List<V>> içine Listesini <V> dönüştürmek için?
public Map<Integer, List<String>> getMap(List<String> strings) {
return
strings.stream()
.collect(Collectors.groupingBy(String::length));
}
Ama ben kendi List
ve Map
tedarikçileri ile yapmak istiyorum.
aklıma bu geldi:
public Map<Integer, List<String>> getMap(List<String> strings) {
return strings.stream()
.collect(Collectors.toMap(
String::length,
item -> {List<String> list = new ArrayList<>(); list.add(item); return list;},
(list1, list2) -> {list1.addAll(list2); return list1;},
HashMap::new));
}
Soru: bunu yapmanın daha kolay, daha az ayrıntılı, ya da daha verimli bir yolu var mı? Örneğin, böyle bir şey (hangi çalışmıyor):
return strings.stream()
.collect(Collectors.toMap(
String::length,
ArrayList::new,
HashMap::new));
Ya ben sadece List
tedarikçisi tanımlamak gerekirse, ancak Map
tedarikçisi?
public Map<Integer, List<String>> getMap(List<String> strings) {
return strings.stream().collect(
Collectors.groupingBy(String::length, HashMap::new, Collectors.toCollection(ArrayList::new))
);
}
kolektör groupingBy(classifier, mapFactory, downstream)
mapFactory
için o aranan haritanın bir tedarikçisi ileterek, haritanın türü aranıyor belirtmek için kullanılabilir:
bir [ 'groupingBy'] (https://docs.oracle.com/javase/8/docs/api/java yoktur /util/stream/Collectors.html#groupingBy-java.util.function.Bir harita tedarikçisi alarak Function-java.util.function.Supplier-java.util.stream.Collector-) aşırı yük. – Tunaki
Akışta, ilginizi çekebilecek üç arg toplama yöntemi var –