2017-05-30 56 views
1

這是類MonitoredData如何在Java 8中創建Map <Integer,Map <String,Integer >>類型的映射?

class MonitoredData { 

    public MonitoredData (DateTime startTime, DateTime endTime, String activity){ 
     this.startTime = startTime; 
     this.endTime = endTime; 
     this.activity = activity; 
    } 

    public DateTime getStartTime(){ 
     return this.startTime; 
    } 
    public DateTime getEndTime(){ 
     return this.endTime; 
    } 
    public String getActivity(){ 
     return this.activity; 
    } 

} 

我有一個返回的MonitoredData列表的方法,我不得不生成包含日誌的每一天的活動計數Map<Integer, Map<String, Integer>>類型的數據結構。

public void activitiesPerDay(List<MonitoredData> monitoredData) { 
    Map <Integer, Map<String, Integer>> map = monitoredData.stream() 
      .collect(Collectors.groupingBy(
        element -> element.getStartTime().dayOfMonth()), 
        Collectors.mapping(mapper, downstream) 
        ); 
} 
+2

[Java stream filter sum of values]的可能重複(https://stackoverflow.com/questions/44101297/java-stream-filter-sum-of-values) – Eugene

回答

1

它看起來像你需要一個嵌套groupingBy - 首先由一個月一天,然後由活動:

Map<Integer, Map<String, Long>> map = 
    monitoredData.stream() 
       .collect(Collectors.groupingBy (
         e -> e.getStartTime().dayOfMonth(), 
         Collectors.groupingBy(MonitoredData::getActivity, 
              Collectors.counting()))); 

注意,輸出類型爲Map<Integer, Map<String, Long>>,而不是Map<Integer, Map<String, Integer>>,因爲我使用的是Collectors.counting() ,它返回Long

您可以使用Collectors.summingInt(e -> 1)而不是Collectors.counting()來獲得Integer的計數,該計數將爲您提供Map<Integer, Map<String, Integer>>輸出。

+0

謝謝!現在,我必須創建一個形式爲Map 的數據結構,它爲每個活動映射在監視週期內計算的總持續時間,並過濾總持續時間大於10小時的活動 – yuyu

相關問題