当前位置: 首页 > 面试题库 >

Java Streams:将列表分组到Maps中

关宏毅
2023-03-14
问题内容

如何使用Java Streams执行以下操作?

假设我有以下课程:

class Foo {
    Bar b;
}

class Bar {
    String id;
    String date;
}

我有一个List<Foo>,我想将其转换为一个Map <Foo.b.id, Map<Foo.b.date, Foo>。即:
首先按分组Foo.b.id,然后按分组Foo.b.date

我正在努力采用以下两步方法,但是第二步甚至没有编译:

Map<String, List<Foo>> groupById =
        myList
                .stream()
                .collect(
                        Collectors.groupingBy(
                                foo -> foo.getBar().getId()
                        )
                );

Map<String, Map<String, Foo>> output = groupById.entrySet()
        .stream()
        .map(
                entry -> entry.getKey(),
                entry -> entry.getValue()
                        .stream()
                        .collect(
                                Collectors.groupingBy(
                                        bar -> bar.getDate()
                                )
                        )
        );

提前致谢。


问题答案:

您可以一口气将数据分组,假设只有不同的数据Foo

Map<String, Map<String, Foo>> map = list.stream()
        .collect(Collectors.groupingBy(f -> f.b.id, 
                 Collectors.toMap(f -> f.b.date, Function.identity())));

使用静态导入保存一些字符:

Map<String, Map<String, Foo>> map = list.stream()
        .collect(groupingBy(f -> f.b.id, toMap(f -> f.b.date, identity())));


 类似资料:
  • 在有趣的功能中,当我将列表添加到其他列表时,它正在添加空列表,我可以找到原因有人可以帮助我这个程序是关于查找给定数组的不同组合

  • 我有以下Apache Spark数据帧(DF1): 首先,我想按对DataFrame进行分组,将结果收集到中并接收新的DataFrame(DF2): 之后,我需要收集到通过分组,我将收到如下所示的新DataFrame(DF3): 所以,我有一个问题 - 首先,我可以在阿帕奇火花中使用按数组类型列分组吗?如果是这样,我可能会在 单个字段中result_list数千万个值。在这种情况下,阿帕奇火花是否

  • 给定一个< code>n数和sum 的列表,将这些数分成< code >两个组,使得每组中的数之和小于或等于s。如果可以分组,则打印< code>YES,如果不能分组,则打印< code>NO。 例如,如果< code>n=3,s=4和< code>n数是< code>2,4,2。在这种情况下,输出为< code>YES,因为可以形成两个组< code>(2,2)和(4)。 我的解决方案如下。 是

  • 问题内容: 从此列表: 我正在尝试创建: 被发现相同的任何值都被分组到其自己的子列表中。到目前为止,这是我的尝试,我在想应该使用循环吗? 问题答案: 有人提到它会得到 换句话说,当列表的编号不按顺序排列或为混乱列表时,该列表将不可用。 所以我有更好的答案来解决这个问题。

  • 根据以下答案:https://stackoverflow.com/a/30202075/8760211 如何按stud\u id对每个组进行排序,然后返回一个包含所有学生的列表,作为按stud\u位置分组的结果,然后按stud\u id排序)? 将此作为现有Lambda表达式的扩展将非常好: 我需要根据原始列表中元素的顺序进行分组。 结果如下所示: 我尝试了以下方法: 但这行不通。