【问题标题】:Collect by function with parameter in Java Stream APIJava Stream API 中带参数的函数收集
【发布时间】:2015-07-24 19:43:58
【问题描述】:

从教程here,我看到我可以按属性对对象进行分组:

Map<Person.Sex, List<Person>> byGender =
    roster
        .stream()
        .collect(
            Collectors.groupingBy(Person::getGender));

如果我需要按带有参数的方法进行分组,例如steve.get("height") 而不是steve.getHeight(),该怎么办?我怀疑这可以用 lambda 来完成,但我找不到正确的语法。我现在所拥有的:

people.stream().collect(Collectcors.groupingBy(p -> p.get("height")));

按 lambda 函数的结果分组的正确语法是什么?

【问题讨论】:

  • 那么编译错误是什么?您尝试将结果分配给的地图看起来如何?这个get 方法有什么作用?
  • Person 是否有一个名为get 的方法?什么是编译错误?如果您的代码无法编译并且您不明白原因,发布编译错误会很有帮助。
  • 同意@AlexisC 的评论,请编辑您的问题以包含MVCE
  • 好的。具体错误无关紧要。我认为steve.get("height") 暗示Person.get(String) 确实是一个函数。无论如何,我想出了答案。

标签: java lambda java-8 java-stream


【解决方案1】:

想通了:

people.stream().collect(Collectors.groupingBy(p -> p.get("height"), Collectors.toSet()));

【讨论】:

  • 如果您解决了问题,那就太好了,但我建议您将编译错误和您尝试分配结果的地图类型也包括在内。就目前而言,您的问题/答案对社区不是很有帮助......因为p -&gt; p.get("height") 可能是一个有效的分组功能。
  • 您在问题中没有说您将结果类型从… List&lt;Person&gt;&gt; 更改为… Set&lt;Person&gt;&gt;。如果你这样做了,一个合适的答案会立即出现。但是,如果您只是考虑将期望从 List 更改为 Set 的事实,您就会明白这与分组函数的 语法 无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 2015-03-03
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
  • 2016-12-27
  • 2013-12-07
相关资源
最近更新 更多