2017-08-07 21 views
0

我現在有一類,如何添加標籤到由Java 8分組功能形成的結果中?

public class Person { 
    private String country; 
    private String age; 
    private String name; 
} 

以這個人類作爲參數的一個列表,

List<Person> 

我使用爪哇8組由管理對它們作如下的數據結構組(集合)功能:

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

我可能不會(只)爲此使用流。流是一種工具,如果你發現自己在使用它們的時候跳過,那麼值得問問他們是否真的是工作的正確工具。即使你*能夠*在一個單一的流表達式中獲得你正在尋找的結構,所得到的代碼對於未來的讀者(包括你自己)來說將難以理解。 – dimo414

+1

您在問題中顯示的「數據結構」不是數據結構,而是文本表示,顯然是JavaScript語法的JSON語法,但不是Java。當你想要某個*數據結構*時,你應該指定一個數據結構。 – Holger

回答

3

你已經開始與輸入(一系列Person實例)和工具(.groupingBy()),而不是輸入和所需的輸出。確定首先,然後確定哪個工具是將輸入轉換爲所需輸出的最合適方式。

例如,你可能想用一個Country對象,包含名稱和Age對象,每一個都包含一個年齡和一組People對象的列表結束。考慮到這樣的結構,你可以做一個單一的.groupingBy()傳球按國家進行分組,並將結果列表傳遞給Country(String name, List<Person> people)構造函數,然後構造函數依次傳遞另一個.groupingBy()以按年齡分組,並調用構造函數Age(int age, List<Person>)

如果您的目標是將此結構序列化爲JSON-ish字符串,那麼您現在可以在Country.toString()中輕鬆完成此操作,現在您已擁有所需結構中的數據。

將代表性問題(如渲染該複雜結構的字符串表示)分離出結構問題(如從List<Foo>轉換爲像Map<Bar, Map<Baz, Set<Foo>>>這樣複雜的東西)總是一個好主意。你會發現單獨解決這兩個步驟通常要容易得多,而且容易維護,而不是一舉全力。

相關問題