List<String>到Map<String,String>与流,字符串拆分
我有字符串列表:
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];
回答
- 拆分应该由
"="(或"\s*=\s"排除周围的空格=)完成
更新此外,最好在第一次出现时提供limit参数 to String::splitsplit "=",感谢@AndrewF 的建议!
- 修复
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())
));
- Consider `String.split( /* ... */ , 2)` so that any equals signs in the _value_ will not result in an array with _length > 2_ and truncated value in the final result.
THE END
二维码