我有一个MoveTrack对象的列表,我想按月分组,然后将数据计数并存储在Map<String, Double>中。我正在尝试学习Lambda并进行实验,因此尝试使用Lambda完成此任务。

class MoveTrack {
private Date time;
private Double movementAmount;

//getters and setters
}

// in my main method
List<MoveTrack> mveTracking = new ArrayList<>();
Map<String, Double> movMap = new HashMap<>();

因此,我希望能够对moveTracking列表进行分组,并将这些值求和到movMap中,每个Map Key =月名称(一月,二月等)和相应的Value就是该月的两倍移动量。

最佳答案

Collectors.groupingBy 允许您将列表缩减为 map ,其中键是对列表元素的某种操纵,而值是应用于该元素的某种聚合函数。
在您的情况下,您可以使用以下方式:

SimpleDateFormat monthFormatter = new SimpleDateFormat("MMM");
Map<String, Double> moveMap =
    moveTracking.stream()
                .collect(Collectors.groupingBy
                    (m -> monthFormatter.format(m.getTime()),
                     Collectors.summingDouble(MoveTrack::getMovementAmount)));

10-02 07:57