如何为Java 8 grouping by function形成的结果添加标签?

时间:2017-08-07 23:44:55

标签: java java-8 nested

我目前有一个班级,

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....

1 个答案:

答案 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>这样的复杂事物)从表达式关注点分离出来总是一个好主意(比如渲染该复合体的字符串表示形式)结构体)。你会发现,单独解决这两个步骤往往比一次性完成更容易 - 而且更容易维护。

相关问题