如何为Java 8分组函数形成的结果添加标签?
我目前有一节课,
public class Person { private String country; private String age; private String name; }
以此Person类的列表作为参数,
List
我设法使用Java 8 group by(集合)函数将它们分组到以下数据结构中:
Map<String, Map<String, Set>>
例:
USA={ 21= [ John, Peter. Andrew ], 22= [ Eric, Mark ] ] }, France = { etc....
以下是我的function:
public static Map<String, Map<String, Set>> getNestedMap(List 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....
您已经开始使用输入(一系列Person
实例)和一个工具( .groupingBy()
),而不是输入和所需的输出 。 首先确定, 然后确定哪种工具是将输入转换为所需输出的最合适方式。
例如,您可能希望以Country
对象结束,该对象包含名称和Age
对象列表,每个对象都包含一个年龄和一组People
对象。 考虑到结果,您可以按国家/地区分组.groupingBy()
传递,并将结果列表传递给Country(String name, List
构造函数,然后构造函数再执行另一个.groupingBy()
按年龄传递给group,并调用Age(int age, List
构造函数。
如果您的目标是将此结构序列化为JSON-ish字符串,则可以在Country.toString()
轻松完成,现在您拥有所需结构中的数据。
将结构关注点(例如从List
为像Map
这样的复杂事物)从表示关注点(比如渲染字符串表示forms)一直是个好主意复杂的结构)。 你会发现分别解决这两个步骤通常比一次性完成更容易 – 并且更容易维护。