如何使用特定的键和值将流分组到地图?

Mar*_*ace 6 java collections java-8 java-stream

我有一个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()));
Run Code Online (Sandbox Code Playgroud)

这失败了"无法从静态上下文引用非静态方法":

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

我究竟做错了什么?

And*_*eas 7

正确的代码是:

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

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

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

  • 就像免责声明一样; 我尽量避免使用`import static`.它使得特定方法的来源变得不那么明显.有时候我同意它(比如说,在测试类中大量使用断言方法或模拟方法,或者大量使用常量类),但对于一次性方法调用,我发现只使用`Class.method`更干净.调用方法的风格. (2认同)