【问题标题】:GroupingBy using Java 8 streams使用 Java 8 流进行分组
【发布时间】:2019-02-23 11:38:28
【问题描述】:

我正在使用Java 8 Streams 我有一个类似下面的课程:

public class ShareDao {
    private String senderId;
    private String receiverId;

    public String getSenderId() {
        return senderId;
    }

    public String sharingMode(){
        return this.receiverId != null && !this.receiverId.trim().isEmpty() ? "incoming" : "outgoing";
    }
}

现在我想做的是,我想:

  1. 过滤掉 senderId 无效的记录(使用 Map 查找)
  2. 按 senderId 对集合进行分组,然后按 shareMode 对它们进一步分组。

下面是我的代码:

Map<String, Map<String, List<ShareDao>>> p = records.stream()
            .filter(shared -> userMap.containsKey(shared.getSenderId()))
            .collect(Collectors.groupingBy(ShareDao::getSenderId), Collectors.groupingBy(ShareDao::sharingMode, Function.identity()));

它抛出了错误:

错误:(105, 90) java: 没有找到适合 groupingBy(Share[...]gMode,java.util.function.Function) 的方法 方法 java.util.stream.Collectors.groupingBy(java.util.function.Function) 不适用 (无法推断类型变量 T,K (实际参数列表和形式参数列表的长度不同)) 方法 java.util.stream.Collectors.groupingBy(java.util.function.Function,java.util.stream.Collector) 不适用 (不存在类型变量 T 的实例,因此 java.util.function.Function 符合 java.util.stream.Collector) 方法 java.util.stream.Collectors.groupingBy(java.util.function.Function,java.util.function.Supplier,java.util.stream.Collector) 不适用 (无法推断类型变量 T、K、D、A、M (实际参数列表和形式参数列表的长度不同)

Intellij Idea 引发错误

Non-Static method cannot be referenced from static context

【问题讨论】:

标签: java collections java-8 java-stream


【解决方案1】:

基于你想要达到的目标

  • 过滤掉 senderId 无效的记录(使用 Map
    查找)
  • 按 senderId 对集合进行分组,然后按 shareMode 对它们进一步分组。

您可以改为使用:

Map<String, Map<String, List<ShareDao>>> p = records.stream()
        .filter(shared -> userMap.containsKey(shared.getSenderId())) // filter records
        .collect(Collectors.groupingBy(ShareDao::getSenderId, // grouping by senderId
                Collectors.groupingBy(ShareDao::sharingMode)));  //further grouping by sharingMode

注意

  1. groupingBy 属性导致值聚合为List

  2. collect 中定义的 Collector,因为它与您的尝试不同。

【讨论】:

  • 我编辑了问题,List 只是一个复制粘贴错误,因为我更改了类名和类型以适应问题。
  • @iam.Carrot 我希望第 (2) 点仍然适用于答案:)
  • 是的,因此我将其标记为答案,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-26
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
相关资源
最近更新 更多