Convert String array to Map using Java 8 Lambda expressions

68,737

You can modify your solution to collect the Stream of String arrays into a Map (instead of using 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])));

Of course this solution has no protection against invalid input. Perhaps you should add a filter just in case the split String has no separator :

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

This still doesn't protect you against all invalid inputs (for example "c:3r" would cause NumberFormatException to be thrown by parseDouble).

Share:
68,737
bsam
Author by

bsam

Updated on July 09, 2022

Comments

  • bsam
    bsam almost 2 years

    Is there a better functional way of converting an array of Strings in the form of "key:value" to a Map using the Java 8 lambda syntax?

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

    The solution I have right now does not seem really functional:

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