如何为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 people)构造函数,然后构造函数再执行另一个.groupingBy()按年龄传递给group,并调用Age(int age, List)构造函数。

如果您的目标是将此结构序列化为JSON-ish字符串,则可以在Country.toString()轻松完成,现在您拥有所需结构中的数据。

将结构关注点(例如从List为像Map>>这样的复杂事物)从表示关注点(比如渲染字符串表示forms)一直是个好主意复杂的结构)。 你会发现分别解决这两个步骤通常比一次性完成更容易 – 并且更容易维护。