Java Collectors.groupingBy和map
经过双倍计算后,我正在努力Java Collectors.groupingBy和map,java,java-8,Java,Java 8,经过双倍计算后,我正在努力groupBy说出所有人的名字 persons.stream() .map(p -> (p.getHeight() * p.getWeight())) .collect(Collectors.groupingBy(Person::getName))); 但是Stream不适用于这些参数 我如何处理整数/双精度,然后按字符串分组?它不起作用,因为您的映射是将它从人映射到整数或双精度(取决于身高/体重的
groupBy
说出所有人的名字
persons.stream()
.map(p -> (p.getHeight() * p.getWeight()))
.collect(Collectors.groupingBy(Person::getName)));
但是Stream
不适用于这些参数
我如何处理整数/双精度,然后按字符串分组?它不起作用,因为您的
映射是将它从人
映射到整数
或双精度
(取决于身高/体重的测量方式)。一旦map
调用完成,您实际上就拥有了一个数字流,因此无法将其作为Person
对象收集
persons.stream() // Stream of Person objects
.map(p -> (p.getHeight() * p.getWeight())) // Stream of numbers.
JavaDoc for Stream.map()证实了这一点:
返回一个流,该流包含将给定函数应用于该流元素的结果
如果我们能更多地了解您试图如何处理这些流,我们可能会给您一个更直接的答案,告诉您如何解决这个问题。一个可能的解决方案如下:
persons.stream().collect(Collectors.groupingBy(
Person::getName,
HashMap::new,
Collectors.mapping(
p -> p.getHeight() * p.getWeight()
Collectors.toList())));
或者,如果您不希望出现重复的名称,可以使用更简单的名称
persons.stream().collect(Collectors.toMap(
Person::getName,
p -> p.getHeight() * p.getWeight()));
@Todd已经回答了您为什么会看到这个问题,但这将有助于说明您正试图完成的任务或您希望得到的结果。显示计算结果而不显示每个组的名称是没有意义的。我希望通过使用cast或reduce找到一种方法,但没关系。非常感谢。