【问题标题】:List<String> to Map<String,String> with stream, with String splittingList<String> 到 Map<String,String> 与流,与字符串拆分
【发布时间】:2021-03-26 18:51:06
【问题描述】:

我有字符串列表:

List<String> cookiesUpdate = Arrays.asList("A=2" , "B=3");
    

我想把它转换成地图:

{
  "A": "2",
  "B": "3"
}

代码:

Map<String, String> cookies = cookiesUpdate.stream()
     .collect(Collectors.toMap(String::toString, String::toString));

上面的那些拆分器怎么写?如果编译器认为 key String 是 Object.

.split("=")[0];
.split("=")[1];

【问题讨论】:

    标签: java string list split java-stream


    【解决方案1】:
    1. 应由"=" 完成拆分(或"\\s*=\\s" 以排除= 周围的空格)

    更新另外最好提供limit 参数给String::split 以在"=" 第一次出现时进行拆分,感谢@AndrewF 的建议!

    1. 修复toMapcollector,将数组的第一个元素作为key,最后一个作为value;如果可能有多个同名 cookie,则可能需要合并功能
    Map<String, String> map = cookies.stream()
        .map(ck -> ck.split("\\s*=\\s*", 2)) // Stream<String[]>
        .filter(arr -> arr.length > 1) // ignore invalid cookies
        .collect(Collectors.toMap(arr -> arr[0], arr -> arr[1], (v1, v2) -> v1));
    

    如果有多个具有相同名称的 cookie,可能值得将它们收集到 Set&lt;String&gt; 中,从而保留所有唯一值。为此,Collectors.groupingByCollectors.mapping

    Map<String, Set<String>> map2 = cookies.stream()
        .map(ck -> ck.split("\\s*=\\s*", 2)) // Stream<String[]>
        .filter(arr -> arr.length > 1) // ignore invalid cookies
        .collect(Collectors.groupingBy(
            arr -> arr[0], 
            Collectors.mapping(arr -> arr[1], Collectors.toSet())
        ));
    

    【讨论】:

    • 考虑 String.split( /* ... */ , 2) 以便 value 中的任何等号不会导致数组的 length > 2 和最终值被截断结果。
    • String.split("\\s*=\\s*", 2) 将导致编译错误Cannot make a static reference to the non-static method split(String, int) from the type String。而且你不需要, (v1, v2) -&gt; v1
    • @saka1029,你说得对,应该是ck.split,我修好了。如果测试数据为:List&lt;String&gt; cookies = Arrays.asList("a=b", "a=c", "p=qqq");,则可能需要合并函数来处理 cookie 名称的可能重复项,以防止在 java.lang.IllegalStateException: Duplicate key a (attempted merging values b and c) 之后失败
    猜你喜欢
    • 2018-11-26
    • 2020-08-01
    • 2013-08-28
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 2019-11-27
    • 2018-09-22
    • 2021-04-29
    相关资源
    最近更新 更多