2017-04-12 19 views
1

,所以我有這樣的代碼,「工程」(更換一些名稱爲簡單起見):創建使用GROUPBY嵌套地圖,收集到不同類型的對象

Map<String, Map<String, ImmutableList<SomeClassA>>> someMap = 
     someListOfClassA.stream() 
     .filter(...) 
     .collect(Collectors.groupingBy(SomeClassA::someCriteriaA, 
      Collectors.groupingBy(SomeClassA::someCriteriaB, GuavaCollectors.toImmutableList() 
      ) 
    )); 

不過,我想改變這個代碼,以便相反,我們在分組SomeClassA之後創建新的SomeClassB。因此,如果類是這樣的:

因此,例如,(假設他們都已經全部ARGS構建

class SomeClassA { 
    String someCriteriaA; 
    String someCriteriaB; 
    T someData; 
    String someId; 
} 

class SomeClassB { 
    T someData; 
    String someId; 
} 

我希望能夠改爲建立

Map<String, Map<String, ImmutableList<SomeClassB>>> someMap = 
    someListOfClassA.stream() 
    .filter(...) 
    . // not sure how to group by SomeClassA values while creating new SomeClassB instances 

我我不知道這將如何適合上面的代碼。我如何構建SomeClassB基於SomeClassA的值實例?

任何想法,將不勝感激!

+2

'Collectors.mapping(SomeClassB :: new,GuavaCollectors.toImmutableList())' – 4castle

+0

@ 4castle - 你能提供一些關於如何工作的細節嗎?你如何從分組的SomeClassA對象中獲取值到新創建的SomeClassB實例中? – Otter

+1

'SomeClassB :: new'可以用任何將某個'SomeClassA'實例轉換爲'SomeClassB'的lambda或方法引用來替換。 'Collectors.mapping'只是在收集下游收集器中的輸出之前通過函數運行該值。 – 4castle

回答

0

使用收藏家那樣:

Map<String, Map<String, ImmutableList<SomeClassB>>> someMap = 
    someListOfClassA 
    .stream() 
    .filter(...) 
    .collect(Collectors.groupingBy(SomeClassA::someCriteriaA, 
       Collectors.groupingBy(SomeClassA::someCriteriaB, 
       Collectors.mapping(someClassA -> new SomeClassB(), GuavaCollectors.toImmutableList())))); 

儘管你可以用你的代碼替換someClassA -> new SomeClassB()SomeClassA實例轉換到SomeClassB一個實例。

Collectors.mapping()只會在收集發生之前應用給定的函數。

相關問題