Java Stream - 将一行数据收集到较少的行中,其中一列分组为set

时间:2017-03-31 23:13:36

标签: java java-stream collectors

我刚开始使用Java流,所以我为任何误解而道歉。

我希望在我的流上使用Collect来返回一个流,该流具有与所有元素匹配的分组行,但只有一行成为单个行,其中一个元素被添加到集合中。

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

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

收集第3列后,它将返回带有数据的流:

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

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

谢谢。

2 个答案:

答案 0 :(得分:2)

您需要做的是创建一个水果类。 一旦你完成了这个,你有三个吸气剂

getNumber,getType,getName。

所以现在你有一个名为list的水果列表。

一旦你有了,你会这样做:

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

这将返回一个哈希映射的哈希映射,如下所示:

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

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

答案 1 :(得分:1)

以下是此演示的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()))));