Java Stream - 将数据行收集到更少的行中,并将一列分组到集合中

Java Stream - Collecting rows of data into less rows with one column grouped into set

我刚开始使用 Java 流,所以对于任何误解,我深表歉意。

我希望在我的流中使用 Collect 来 return 一个流,该流具有匹配所有元素的分组行,但一个元素进入单个行,其中一个元素被添加到一个集合中。

例如,如果我的流包含数据:

[{12, "Apple", "Gala"},
 {12, "Apple", "Fuji"},
 {13, "Orange", "Navel"},
 {13, "Orange", "Valencia"}] 

收集第 3 列后,它将 return 流式传输数据:

[{12, "Apple", ["Gala", "Fuji"]},
 {13, "Orange", ["Navel", "Valencia"]}]

这可以使用流收集方法吗?非常感谢任何帮助!

谢谢。

你需要做的是创造一个水果class。 一旦你这样做了,你就有了三个 getter

获取编号、获取类型、获取名称。

现在你有了一个水果列表。

一旦你有了它,你会做:

list.stream()
    .collect(Collectors.groupingBy(Fruit::getNumber,
        Collectors.groupingBy(Fruit::getName, Collectors.mapping(Fruit::getType, Collectors.toList())))));

这将 return 哈希图的哈希图,如下所示:

{12={Apple=[Gala]}, 13={Orange=[Navel, Valencia]}}

如果您希望水果对象成为键而不是名称,您可以将 Fruit::getName 替换为 Function.identity()。

这是此演示的rextester

Map<Integer, Map<String, Set<String>>> fruitsByIdByType = 
                   fruits.stream()
                    .collect(Collectors.groupingBy(Fruit::getId, Collectors.groupingBy(Fruit::getName, Collectors.mapping(Fruit::getType, Collectors.toSet()))));