web-dev-qa-db-ja.com

Java 8ラムダ式を使用して文字列配列をマップに変換

Java 8 lambda構文を使用して、 "key:value"の形式の文字列の配列をMapに変換するより機能的な方法はありますか?

Arrays.asList("a:1.0", "b:2.0", "c:3.0")
        .stream()
        .map(elem -> elem.split(":")
        .collect(Collectors.toMap(keyMapper?, valueMapper?));

私が今持っている解決策は実際には機能していないようです:

Map<String, Double> kvs = new HashMap<>();
Arrays.asList("a:1.0", "b:2.0", "c:3.0")
        .stream()
        .map(elem -> elem.split(":"))
        .forEach(elem -> kvs.put(elem[0], Double.parseDouble(elem[1])));
30
bsam

Stream配列のStringを(Mapを使用する代わりに)forEachに収集するようにソリューションを変更できます。

Map<String, Double> kvs =
    Arrays.asList("a:1.0", "b:2.0", "c:3.0")
        .stream()
        .map(elem -> elem.split(":"))
        .collect(Collectors.toMap(e -> e[0], e -> Double.parseDouble(e[1]));

もちろん、このソリューションには無効な入力に対する保護はありません。おそらく、分割された文字列にセパレータがない場合に備えて、フィルタを追加する必要があります。

Map<String, Double> kvs =
    Arrays.asList("a:1.0", "b:2.0", "c:3.0")
        .stream()
        .map(elem -> elem.split(":"))
        .filter(elem -> elem.length==2)
        .collect(Collectors.toMap(e -> e[0], e -> Double.parseDouble(e[1]));

それでも、すべての無効な入力に対して保護されません(たとえば、"c:3r"は、NumberFormatExceptionによってparseDoubleがスローされる原因になります。

53
Eran