Java 流将字符串拆分和收集到 Map

And*_*897 -1 java java-8 java-stream

我有一个这样的字符串

String input = "abc|label1 cde|label2 xyz|label1 mno|label3 pqr|label2";
Run Code Online (Sandbox Code Playgroud)

我想创建一个看起来像的地图(过滤掉 label3} label1 -> {abc,xyz} label2 -> {cde,pqr} label3 -> {mno}

这是我目前能做的

  Map<String, List<String>> result = Arrays.stream(inputString.split(" "))
                .filter(i -> !i.contains("label3"))
                .map(i -> i.split("//|"))
Run Code Online (Sandbox Code Playgroud)

还有第二个用例:我如何只收集一个字符串中的所有令牌

abc|label1 cde|label2 xyz|label1 mno|label3 pqr|label2 => "abc cde xyz mno pqr"

Dea*_*ool 5

先用空格作为分隔符分割

input.split(" ") //[abc|label1, cde|label2, xyz|label1, mno|label3, pqr|label2]
Run Code Online (Sandbox Code Playgroud)

然后用管道\作为分隔符分割数组中的每个字符串并使用Collectors.groupingBy

Map<String, List<String>> map = Arrays.stream(input.split(" "))
                                      .map(s -> s.split("\\|"))
                                      .collect(Collectors.groupingBy(str -> str[1], 
                                             Collectors.mapping(str -> str[0], Collectors.toList())));
Run Code Online (Sandbox Code Playgroud)

输出 :

{label1=[abc, xyz], label2=[cde, pqr], label3=[mno]}
Run Code Online (Sandbox Code Playgroud)

用于Collectors.joiningMapString 中收集值

String result = map.values()
                   .stream()
                   .flatMap(Collection::stream)
                   .collect(Collectors.joining(" "));
Run Code Online (Sandbox Code Playgroud)