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

使用Java8流对不同类的对象进行分组

上官树
2023-03-14

我有下面的课

class Pojo1 {
    pojo2 item;
}

class pojo2 {
    pojo3 item;
}

class pojo3 {
   pojo4 item;
}
Map<pojo4,Map<pojo3,List<pojo2>>>  k=new HashMap()<>;
   (pojo4 - some property)
   (pojo3 - some property)
   (pojo2- some property)

共有1个答案

拓拔霄
2023-03-14

首先,提到的POJO类POJO4POJO3需要实现hashcodeequals,以便用作映射键以及属性的相关getter。

转换应该使用公共collectors.Groupingby/collectors.Mapping收集器,并且需要将初始重新映射到两个对象的纯容器,例如Pair

下面的示例使用Java11map.entry作为中间容器。

static Map<Pojo4, <Map<Pojo3, List<Pojo2>>>> convert(Stream<Pojo1> ones) {
    return ones              // Stream<Pojo1>
        .map(Pojo1::getItem) // Stream<Pojo2>
        .map(p2 -> Map.entry(p2, p2.getItem())) // Stream<Map.Entry<Pojo2, Pojo3>>
        .collect(Collectors.groupingBy(
            me -> me.getValue().getItem(), // key: Pojo4
            Collectors.groupingBy(
                me -> me.getValue(), // key: Pojo3
                Collectors.mapping(
                    Map.Entry::getKey, Collectors.toList()
                )
            )
        ));
}

假设pojo2pojo3pojo4有gettergetfield,以便对属性进行排序,则提供以下更新:

static Map<Pojo4, <Map<Pojo3, List<Pojo2>>>> convert(Stream<Pojo1> ones) {
    return ones
        .map(Pojo1::getItem) // Stream<Pojo2>
        .map(p2 -> Map.entry(p2, p2.getItem())) // Stream<Map.Entry<Pojo2, Pojo3>>
        .collect(Collectors.groupingBy(
            me -> me.getValue().getItem(), // key: Pojo4
            () -> new TreeMap(Comparator.comparing(Pojo4::getField)),
            Collectors.groupingBy(
                me -> me.getValue(), // key: Pojo3
                () -> new TreeMap(Comparator.comparing(Pojo3::getField)),
                Collectors.mapping(
                    Map.Entry::getKey, Collectors.collectingAndThen(
                        Collectors.toList(), // List<Pojo2>
                        list -> {
                            list.sort(Comparator.comparing(Pojo2::getField)); 
                            return list;
                        }
                    )
                )
            )
        ));
}

免责声明:上面的代码示例没有经过测试,因此可能需要额外的调整。

 类似资料:
  • 我有一个像 我有一个用户对象列表,比如:示例数据 我的问题是,如何将此列表分组以了解品牌id出现在哪些对象中,例如品牌id=10出现在所有三个对象中,品牌id=30仅出现在一个对象中 带有 key=brand id 和 value = count 的地图的结果将解决我的问题,如下所示:{10:3},{20:1},{30,1},{50,1},{80,1 }

  • 我正在使用我有一个类,如下所示: 现在我想做的是: 筛选出senderId无效的记录(使用映射) 下面是我的代码: 这给我带来了一个错误: 错误:(105,90)java:找不到适用于groupingBy(共享[…]的方法gMode,java。util。作用函数)方法java。util。流动收藏家。groupingBy(java.util.function.function)不适用(无法推断类型变

  • 问题内容: 给出: 给出: 是否有准备使用的库/代码来完成它? 问题答案: 您将无法使用JSON.stringify序列化事件对象,因为事件对象包含对DOM节点的引用,并且DOM在各处都有循环引用(例如,子/父关系)。JSON默认情况下无法处理这些,因此您有点不走运。

  • 问题内容: 我的数组是这样的: 我想将其转换为: 因此,基本上,分组依据。 我尝试着: 我只是不知道如何处理相似组值的分组。 问题答案: 首先,在JavaScript中,使用遍历数组通常不是一个好主意。 因此,您可以尝试执行以下操作: 在这里使用中间对象有助于加快处理速度,因为它可以避免嵌套循环搜索数组。另外,因为使用迭代遍历对象(而不是数组)是合适的。 附录 FWIW,如果要避免在结果数组中出现

  • 我对Java8相当陌生。我需要将普通对象列表转换为按特定标准分组并在用户界面上显示。 地图的关键应该是“fromDate-todate”的组合,学生名单应该与此组合相关联 此外,“ClassOfMSWAN”对象需要转换为“Student”对象并保存到列表中 Java1的代码。7已编写,需要转换为Java1。八, 请帮帮我。

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