我目前有一个班级,
public class Person {
private String country;
private String age;
private String name;
}
将此Person类的列表作为参数,
List<Person>
我设法使用 Java 8 group by(collection)函数将它们分组到以下数据结构中:
Map<String, Map<String, Set<String>>>
示例:
USA={
21=
[
John,
Peter.
Andrew
],
22=
[
Eric,
Mark
]
]
},
France = {
etc....
以下是我的功能:
public static Map<String, Map<String, Set<String>>> getNestedMap(List<Person> persons) {
return persons.stream().collect(
groupingBy(Person::getCountry,
groupingBy(Person::getAge,
mapping(Person::getName, toSet())
)));
}
但是,我希望我的数据结构看起来像这样,每个级别都有标签。有没有办法 Java 8 group by(collection)可以帮助实现这个目标?还是有更好的方法?
Country = USA,
AgeList = {
Age = 21,
People =
[
[Name = John],
[Name = Peter],
[Name = Andrew]
],
Age = 22,
People =
[
[Name = Eric],
[Name = Mark]
]
]
},
Country = France,
AgeList = {
etc....
答案 0 :(得分:3)
您已经开始使用输入(一系列Person
个实例)和一个工具(.groupingBy()
),而不是输入和所需的输出。首先确定,然后确定哪种工具是将输入转换为所需输出的最合适方式。
例如,您可能希望最终得到一个Country
对象,其中包含一个名称和一个Age
个对象列表,每个对象都包含一个年龄和一组{{1}个对象。对象。考虑到结果,您可以按国家/地区分组People
传递,并将生成的列表传递给.groupingBy()
构造函数,然后再执行另一个Country(String name, List<Person> people)
传递按年龄分组,并调用.groupingBy()
构造函数。
如果您的目标是将此结构序列化为JSON-ish字符串,则可以在Age(int age, List<Person>)
中轻松完成,现在您拥有所需结构中的数据。
将结构问题(例如从Country.toString()
转换为像List<Foo>
这样的复杂事物)从表达式关注点分离出来总是一个好主意(比如渲染该复合体的字符串表示形式)结构体)。你会发现,单独解决这两个步骤往往比一次性完成更容易 - 而且更容易维护。