Java 8+映射列表映射

Nic*_*ckJ 4 java java-8 java-stream

我有这样定义的列表列表:

Map<Date,List<TimesheetContribution>> groupedByDate;
Run Code Online (Sandbox Code Playgroud)

TimesheetContribution类具有getHours()方法,该方法返回double。

我想要的是:

Map<Date, Double> hoursMap = groupedByDate.entrySet().stream()...
Run Code Online (Sandbox Code Playgroud)

映射值是TimesheetContribution实例的总时数。

我能想到的唯一方法是这样的:

Map<Date, Double> toilAmounts = groupedByDate.entrySet().stream()
    .collect(Collectors.toMap(Function.identity(), value -> ???));
Run Code Online (Sandbox Code Playgroud)

如您所见,尝试定义值映射器时遇到麻烦,并且我需要一个嵌套流,对此感到不舒服。

有什么建议么?还是我必须用老式的方式来做?

Nam*_*man 5

你可以这样:

Map<Date, Double> hoursMap = groupedByDate.entrySet()
        .stream()
        .collect(Collectors.toMap(Map.Entry::getKey, // for a key and not an entry
                e -> e.getValue().stream()
                        .mapToDouble(TimesheetContribution::getHours)
                        .sum()));
Run Code Online (Sandbox Code Playgroud)