【发布时间】:2018-06-24 21:04:41
【问题描述】:
我有一个扁平的数据结构(实际上是 DB SQL 查询的结果,因此会有很多重复数据),我想将其转换为层次结构。
输入结构:
class Data {
int key1;
String value1;
int key2;
Integer key3;
String finalValue;
}
输出结构
class Struct1 {
int key1;
String value1;
List<Struct2> inner;
}
class Struct2 {
int key2;
List<Struct3> inner;
}
class Struct3 {
int key3;
String finalValue;
}
所以.....
List<Data> input = ....
List<Struct1> results = input.stream().collect(groupingBy(x->x.key1, .....);
我可以使用的工具是 group/map/reduce,但我无法计算出正确的组合/嵌套来实现我想要的结果。
附言只是为了让这变得有趣。这是对数据库的外部联接查询,因此 Struct2 可能没有任何 Struct3 元素(因此 key3 是 Integer 而不是 int)
示例数据:
键 1 值 1 键 2 键 3 最终值 1“值1” 2 3“最终1” 1“价值1” 2 4“最终2” 1 "value1" 3 null null 5“值2” 6 7“最终3”我希望得到类似下面的结果
[{ “key1”:1, “价值1”:“价值1”, “内部”:[{ “key2”:2, “内部”:[{ “key3”:3, “最终值”:“最终 1” }, { “key3”:4, “最终值”:“最终 2” }], }, { “key2”:3, “内部”:[] }], }, { “key1”:5, “价值1”:“价值2”, “内部”:[{ “key2”:6, “内部”:[{ “key3”:7, “最终值”:“最终 3” }] }]这是一个答案,但我不是忠实粉丝:
Map<Long, Data> groupByKey1 = data.stream().collect(groupingBy(x->x.key1));
List<Struct1> result = groupByKey1.entrySet().stream().map(this::createStruct1).collect(toList());
Struct1 createStruct1(Entry<Long, List<Data>> item) {
List<Struct2> struct2 = item.getValue().stream().collect(groupingBy(x->x.key2)).entrySet().stream().map(this::createStruct2).collect(toList());
// create and return Struct1
.....
}
第二次尝试(我认为这是我正在寻找的答案)
Map<Long, Data> groupByKey1 = data.stream().collect(groupingBy(x->x.key1, collectingAndThen(toList(), this::createStruct1));
Struct1 createStruct1(List<Data> item) {
List<Struct2> struct2 = item.stream().collect(groupingBy(x->x.key2, collectingAndThen(toList(), this::createStruct2));
// create and return Struct1
.....
}
提前致谢
学习
【问题讨论】:
标签: java java-stream