2017-02-27 16 views
4

をマップする 私はこのような何かのJava 8で List<String>から Map <String, Integer>を変換したい:私は文字列のリストを持っている、と私は思いますので Javaの一覧<文字列、整数> convertion

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

キーがリストの文字列で、値が整数(ゼロ)であるMapを作成するのが好きです。

私の目標は、文字列リストの要素をカウントすることです(後で私のコード内で)。

「古い」方法で変換するのは簡単です。

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

でも、私にはJava 8ソリューションもあります。

+7

だけ変更 '0' - > '0':名のカウントを取得し、あなただけのCollectors.groupingByCollectors.countingを使用することができます'地図<文字列、整数> namesMap = names.stream()。collect(Collectors.toMap(name - > name、name - > 0)); '重複がある場合は失敗します。 'Map namesMap = names.stream()。collect(Collectors.groupingBy(name - > name、Collectors.counting()));'このメソッドを呼び出すと、 'name - > name'の代わりに' Function.identity() 'を使うこともできます。 – Holger

+0

ああ、働いています、ありがとう! :) – LakiGeri

答えて

6

は、すでに述べたように、Collectors.toMapへのパラメータは関数でなければなりませんので、あなたは、あなたがいずれかを使用することができます(name -> 00を変更する必要があります他のパラメータ名はnameではなく)。

namesに重複があると、結果のマップにキーが重複するため、これが失敗することに注意してください。

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

またはまったくこれらのデフォルト値を初期化し、代わりにgetOrDefaultまたはcomputeIfAbsentを使用しないでください:あなたがしたい場合は、

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

かをこの問題を解決するには、まずStream.distinct経由のパイプストリームをできました名前 `へ

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

toMapコレクタは、キー用と値用の2つのマッパーを受け取ります。キーマッパーはリストから値を返すことができます(つまり、現在持っているname -> nameのいずれか、またはFunction.Identityの組み込みのみを使用できます)。値マッパーは、単に任意のキーのために0のハードコードされた値を返す必要があります:

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

ここでラムダのパラメータの「整数」だけではなく(IMHOではあまり選択されていない)名前ですか? –

+0

@Eugene良い点も。編集され、修正されました。間違いなくコードをよりきれいに見せます。 – Mureinik

関連する問題