使用Java 8 Lambda表达式将字符串数组转换为Map [英] Convert String array to Map using Java 8 Lambda expressions

查看:7834
本文介绍了使用Java 8 Lambda表达式将字符串数组转换为Map的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用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)
(elem - > elem.split(:))
.forEach(elem - > kvs.put(elem [0],Double.parseDouble(elem [ 1])));


解决方案

String 数组的 Stream 收集到 Map (而不是使用 forEach ):

 映射< String,D ouble> 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]));

当然,这个解决方案对于无效输入没有保护作用,也许你应该添加一个过滤器,以防分割字符串没有分隔符:

 映射< 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 )引发。


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

解决方案

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

这篇关于使用Java 8 Lambda表达式将字符串数组转换为Map的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆