Existe-t-il un meilleur moyen fonctionnel de convertir un tableau de chaînes sous la forme de "clé: valeur" en Map
en utilisant la syntaxe Java 8 lambda?
Arrays.asList("a:1.0", "b:2.0", "c:3.0")
.stream()
.map(elem -> elem.split(":")
.collect(Collectors.toMap(keyMapper?, valueMapper?));
La solution que j'ai en ce moment ne semble pas vraiment fonctionnelle:
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])));
Vous pouvez modifier votre solution pour collecter les Stream
des tableaux String
dans un Map
(au lieu d'utiliser 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]));
Bien sûr, cette solution n'a aucune protection contre les entrées invalides. Vous devriez peut-être ajouter un filtre au cas où la chaîne divisée n'a pas de séparateur:
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]));
Cela ne vous protège toujours pas contre toutes les entrées invalides (par exemple "c:3r"
entraînerait NumberFormatException
par parseDouble
).