【问题标题】:How to group a stream to a map by using a specific key and value?如何使用特定的键和值将流分组到地图?
【发布时间】:2019-02-08 23:57:33
【问题描述】:

我有一个Stream<Pair<String, String>> myStream;,我想把它聚合成一个Map<String, Set<String>> result;

我设法做到了以下几点:

Map<String, Set<Pair<String, String>>> result = myStream
  .collect(Collectors.groupingBy(Pair::getKey, Collectors.toSet()));

这失败了,“不能从静态上下文引用非静态方法”:

Map<String, Set<String>> result = myStream
  .collect(Collectors.groupingBy(Pair::getKey, Pair::getValue, Collectors.toSet()));

我做错了什么?

【问题讨论】:

标签: java collections java-8 java-stream


【解决方案1】:

正确的代码是:

Map<String, Set<String>> result = myStream
  .collect(Collectors.groupingBy(Pair::getKey,
              Collectors.mapping(Pair::getValue, Collectors.toSet())));

如果使用import static,则缩写为:

Map<String, Set<String>> result = myStream
  .collect(groupingBy(Pair::getKey, mapping(Pair::getValue, toSet())));

【讨论】:

  • 作为免责声明;我尽量避免使用import static。它使特定方法的来源变得不那么明显。有时我同意它(例如,在测试类中大量使用断言方法或模拟方法,或者大量使用常量类),但对于一次性方法调用,我发现只使用Class.method 样式调用方法。
  • @flakes 很好,这是三个方法调用,可以使用单个import static java.util.stream.Collectors.*; 导入。对于某些静态方法的来源,例如java.lang.Mathjava.util.Arrays,或者这个例子,开发人员不应该在每个方法调用时都需要提醒。请记住,import static 根本没有优先级,它仅在解析方法的所有其他方式(即继承或词法范围,包括其继承)没有导致任何此名称的方法时使用。在这方面,导入并不是解决方法的最模糊的方法。
  • @Holger 再次声明,这是一个免责声明,而不是避免这种导入方式的一揽子规则。也就是说,我最喜欢干净的 Java 代码的一个方面是,我可以用最少的上下文查看一个类,并且几乎可以立即验证我所有组件的来源。当您引入静态导入(以及更具争议的通配符导入)时,您将失去这种便利。作为一个偏执的代码审查者,这让我的生活变得更加艰难,因为现在我必须确认这些调用的有效性。此外,您允许更改命名空间(通过继承或包)以使未编辑的代码路径无效。
  • @flakes 当你看到像foo() 这样的调用时,它可以是包含调用的同一个类中的方法、由该类继承的方法、外部类的方法或继承的方法由外部班级。您必须向上滚动以识别嵌套范围并查看它们的超类型。这些超类型通常由extends SimpleNameimplements SimpleName 给出,因此您现在必须通过导入来识别实际类型。那么您仍然不知道这些类型中的哪一个(或它们的超类型)提供了该方法。 import static 在这里变得更糟的是什么?
  • @Holger 简单地说,为了提高可读性,它们的代价是增加了符号解析的复杂性。随着命名空间范围的增加,解析的复杂性也随之增加。对于简洁的类,这通常不是问题,但对于较长的类或具有复杂继承结构的类,我相信成本大于收益。这是我个人并不赞同的范式。这些帖子可以比我在 cmets 中做得更好stackoverflow.com/a/421127/3280538stackoverflow.com/a/147461/3280538
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 2020-05-23
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多