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找到一种方法,但没关系。非常感谢。