【发布时间】:2021-02-12 01:13:39
【问题描述】:
我收到一个字符串列表,我试图用.groupingBy() 进行分区,这将给我一个Map<String, List<String>>,并转换最终将出现在地图中的列表中的字符串。
Examples I've found 使用 Collectors.mapping,这是我想使用的,但所有示例都使用方法引用,例如 .mapping(SomeClass::getSomething, ...,因为我正在处理字符串,所以无法完成。
我以为我可以使用 lambda 作为映射函数,但似乎无法正确使用语法,最终出现“类型不匹配:无法转换...”错误。
这说明了我正在尝试做的类型——
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>>,包含通过删除前缀从字符串中提取的值。
我的实际用例可能会将一个字符串转换为另一个字符串,或者从更复杂的字符串中提取整数,但这说明了我正在尝试做的事情。
在 groupingBy 时如何使用 lambda 函数进行映射?
从我读过的例子中,我也不清楚Collectors.mapping 中第二个参数toList() 的使用。
我用这段代码创建了一个repl。
【问题讨论】:
-
没有错,只是多加了')'。
-
我认为这只是一个错字。
mapping收集器应该是groupingBy调用的第二个参数,而不是collect调用。 -
@Sweeper - 不确定我是否会称之为错字,我误解了收藏家协会。根据 Erik 的回答弄清楚了。
-
我明白了。关闭投票被撤回。
-
@Horse 显然,您对流和收集器的工作方式有一个错误的想法。无论您是在收集器中还是在收集之前的步骤中应用映射,都没有区别。您可以使用this program(当您在具有更多内核和更大控制台的系统上复制和运行它时会变得更好)。您会看到,无论哪种情况,工作线程都会对特定元素执行相同的步骤,并且结果并行度是相同的。
标签: java java-stream collectors