当前位置: 首页 > 知识库问答 >
问题:

使用Java8流进行分组

夏涵畅
2023-03-14

我正在使用Java8流我有一个类,如下所示:

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<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(共享[…]的方法gMode,java。util。作用函数)方法java。util。流动收藏家。groupingBy(java.util.function.function)不适用(无法推断类型变量T,K(实际参数列表和形式参数列表长度不同))方法java。util。流动收藏家。groupingBy(java.util.function.function,java.util.stream.Collector)不适用(不存在变量类型的实例,因此java。util。作用函数符合java。util。流动收集器)方法。util。流动收藏家。groupingBy(java.util.function.function、java.util.function.Supplier、java.util.stream.Collector)不适用(无法推断类型变量T、K、D、A、M(实际参数列表和形式参数列表长度不同))

Intellij Idea引发错误时

不能从静态上下文引用非静态方法

共有1个答案

田宇
2023-03-14

基于你想达到的目的

  • 筛选出senderId无效的记录(使用映射)

您可以使用:

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

注:

>

  • GroupingBy属性导致值被聚合为List

    Collector集合中定义,因为它与您的尝试不同。

  •  类似资料:
    • 问题内容: 我的清单包含大小等的集合。我尝试这样做,但似乎不起作用。 我想要的最终结果是。 我可以尝试添加在所有的元素和那种出来再做出新的的。但是,有某种班轮吗? 更新: 这可行,但是可以简化吗? 问题答案: @Eugene的回答很甜蜜,因为番石榴很甜。但是,如果您碰巧在类路径中没有番石榴,这是另一种方式: 首先,我将所有集合映射到一个流中,然后对所有元素进行排序,最后,将整个排序后的流收集到集合

    • 我正在使用java lambda对列表进行排序。 我怎样才能反向排序呢?

    • 我有这个列表,我想按保留顺序订购,但我没有在自动完成辅助中找到任何函数 我也尝试过: 但是我有编译错误:

    • 我有一个订单列表,我想使用Java8Stream和Collectors按用户分组。GroupingBy: 这将返回包含用户和订单列表的映射: 我不需要整个对象User,只需要它的username字段,它是一个字符串,所以我想获得如下内容: 我试图使用stream.map将用户映射到username字段,但无法正确实现。我怎样才能尽可能简单地做到这一点呢?

    • <代码>list.stream()。 列表中的每个项目都将从数据库中删除。 假设列表中有3个项目,如何进行单元测试: 删除被调用了3次。 删除被称为“按顺序/顺序”,即列表中的元素顺序?