首页 > 解决方案 > 列表到地图带流,带字符串拆分

问题描述

我有字符串列表:

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

如何编写上面的那些拆分器?如果编译器认为键字符串是对象。

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

标签: javastringlistsplitjava-stream

解决方案


  1. 拆分应该由"="(或"\\s*=\\s"排除周围的空格=)完成

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

  1. 修复toMap收集器使用数组的第一个元素作为键,最后一个作为值;如果可能有多个同名 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<String>从而保留所有唯一值。为此,Collectors.groupingBy并且Collectors.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())
    ));

推荐阅读