Frage Java-Liste zur Zuordnung -Konvertierung


Ich würde gerne eine konvertieren Map <String, Integer> von List<String> in Java 8 etwas wie folgt:

Map<String, Integer> namesMap = names.stream().collect(Collectors.toMap(name -> name, 0));

weil ich eine Liste von Strings habe, und ich möchte eine Map erstellen, wobei der Schlüssel die Zeichenfolge der Liste ist und der Wert Integer (eine Null) ist.

Mein Ziel ist es, die Elemente der String-Liste (später in meinem Code) zu zählen.

Ich weiß, dass es leicht ist, es auf die "alte" Art zu konvertieren;

Map<String,Integer> namesMap = new HasMap<>();
for(String str: names) {
  map1.put(str, 0);
}

aber ich frage mich, ob es auch eine Java 8 Lösung gibt.


5
2018-02-27 13:22


Ursprung


Antworten:


Wie bereits erwähnt, die Parameter zu Collectors.toMap müssen Funktionen sein, also musst du dich ändern 0 zu name -> 0 (Sie können einen anderen Parameternamen anstelle von verwenden name).

Beachten Sie jedoch, dass dies fehlschlägt, wenn Duplikate vorhanden sind names, da dies zu doppelten Schlüsseln in der resultierenden Karte führt. Um dies zu beheben, können Sie den Stream durchleiten Stream.distinct zuerst:

Map<String, Integer> namesMap = names.stream().distinct()
                                     .collect(Collectors.toMap(s -> s, s -> 0));

Oder initialisiere diese Standardeinstellungen überhaupt nicht und benutze sie getOrDefault oder computeIfAbsent stattdessen:

int x = namesMap.getOrDefault(someName, 0);
int y = namesMap.computeIfAbsent(someName, s -> 0);

Oder, wenn Sie die Zählungen der Namen erhalten möchten, können Sie einfach verwenden Collectors.groupingBy und Collectors.counting:

Map<String, Long> counts = names.stream().collect(
        Collectors.groupingBy(s -> s, Collectors.counting()));

8
2018-02-27 13:39



das toMap collector erhält zwei Mapper - einen für den Schlüssel und einen für den Wert. Der Schlüssel-Mapper könnte einfach den Wert von der Liste zurückgeben (d. H. Entweder name -> name wie Sie gerade haben, oder benutzen Sie einfach das eingebaute Function.Identity). Der Wertmapper sollte nur den hartcodierten Wert von 0 für jeden Schlüssel:

namesMap = 
    names.stream().collect(Collectors.toMap(Function.identity(), name -> 0));

6
2018-02-27 13:28