首页 > 解决方案 > Java groupingBy 和转换字符串

问题描述

我收到一个字符串列表,我试图用 进行分区.groupingBy(),这将给我一个Map<String, List<String>>,并转换最终将出现在 Map 中的列表中的字符串。

我发现使用的示例Collectors.mapping是我想使用的,但是所有示例都使用方法引用,例如.mapping(SomeClass::getSomething, ...,由于我正在处理字符串,因此无法完成。

我以为我可以使用 lambda 作为映射函数,但似乎无法正确使用语法,最终出现“类型不匹配:无法转换...”错误。

这说明了我正在尝试做 的事情——</p>

import java.util.*;
import java.util.stream.Collectors;

class Main
{
  public static void main(String[] args)
  {
        List<String> inputs = Arrays.asList("D8", "S1", "S5", "D2", "D15", "S9");
        System.out.println(inputs);

        Map<String, List<String>>
        outputs = inputs.stream()
              .collect(
                  Collectors.groupingBy(s -> s.startsWith("D") ? "desperate" : "serious")
                  //,Collectors.mapping(n -> Integer.valueOf(n.replaceAll("[DS]", "")), Collectors.toList())
              )
              ;

        System.out.println(outputs);
  }
}

这将创建地图,按照我的预期对输入数据进行分组,并生成输出
{desperate=[D8, D2, D15], serious=[S1, S5, S9]}

但是我想要的,正如您可能从注释掉的行
Collectors.mapping(n -> Integer.valueOf(n.replaceAll("[DS]", "")), Collectors.toList())
中猜到的那样,它Map<String, List<Integer>>包含通过删除前缀从字符串中提取的值。

我的真实用例可能会将一个字符串转换为另一个字符串,或者从更复杂的字符串中提取整数,但这说明了我正在尝试做的事情。

分组时如何使用 lambda 函数进行映射?
我也不清楚我读过的例子中第二个参数toList()的使用。Collectors.mapping

我用这段代码创建了一个repl 。

标签: javajava-streamcollectors

解决方案


Collectors.groupingBy()有一个版本需要另一个收集器的值,例如:

@Test
public void streamsTest() {
    List<String> inputs = Arrays.asList("D8", "S1", "S5", "D2", "D15", "S9");
    System.out.println(inputs);

    Map<String, List<Integer>> outputs = inputs.stream()
            .collect(
                    Collectors.groupingBy(
                            s -> s.startsWith("D") ? "desperate" : "serious",
                            Collectors.mapping(
                                    s -> Integer.valueOf(s.substring(1)),
                                    Collectors.toList())));

    System.out.println(outputs);
}

这会产生:

[D8, S1, S5, D2, D15, S9]
{desperate=[8, 2, 15], serious=[1, 5, 9]}

推荐阅读