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])));
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
がスローされる原因になります。