收藏家。组合和地图

时间:2015-01-20 00:44:35

标签: java java-8

我在用双打计算后努力groupBy为所有人命名。

persons.stream()
                .map(p -> (p.getHeight() * p.getWeight()))
                .collect(Collectors.groupingBy(Person::getName)));

Stream<Double>不适用于这些参数。

如何处理整数/双精度然后再处理groupBy String?

2 个答案:

答案 0 :(得分:5)

一种可能的解决方案如下:

 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()));

答案 1 :(得分:1)

它无法正常工作,因为您map正在将其从Person映射到IntegerDouble,(取决于身高/体重的测量方式)。完成map调用后,您实际上会有一个数字流,因此您无法将其作为Person个对象收集。

persons.stream() // Stream of Person objects
  .map(p -> (p.getHeight() * p.getWeight())) // Stream of numbers.

JavaDoc for Stream.map()证实了这一点:

  

返回一个流,该流包含将给定函数应用于此流的元素的结果。enter link description here

如果我们更了解您尝试使用流媒体的内容,我们可以就如何解决问题给您更直接的答案。