web-dev-qa-db-fra.com

Convertir un tableau de chaînes en carte à l'aide de Java 8 expressions Lambda

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])));
30
bsam

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).

53
Eran