如何创建Map <integer,map <string,=“”integer =“”>&gt;类型的地图?在Java 8中?

时间:2017-05-30 06:42:27

标签: java java-8

这是班级MonitoredData

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)
                    );
}

1 个答案:

答案 0 :(得分: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>>输出。