2017-05-30 103 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

相关问题