【问题标题】:Grouping and summing a list into a map using Lambda使用 Lambda 将列表分组和汇总到地图中
【发布时间】:2016-02-22 12:59:03
【问题描述】:

我有一个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 中,每个映射键 = 月份名称(一月、二月等)和对应的值是移动量,即该月的双打总和。

【问题讨论】:

  • 嗯,你试过了吗?我怀疑你想使用Stream.collectCollectors.groupingBy
  • 和 Collectors.summingDouble 作为下游收集器
  • @JonSkeet 是的,尝试了 groupBy 和 toMap,但只有错误。尤其是当我开始放入 simpledateformater 时。
  • 所以请展示您尝试过的内容,以及这些错误是什么。
  • @JonSkeet 一切都好,我首先需要一个全新的视角来确定我是否走在正确的道路上

标签: java lambda java-8


【解决方案1】:

Collectors.groupingBy 允许您将列表简化为映射,其中键是对列表元素的某些操作,值是应用于元素操作的某个聚合函数。 在你的情况下,你可以使用这样的东西:

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

【讨论】:

    【解决方案2】:

    如果您愿意使用第三方库,Eclipse Collections 具有称为 sumBy 的专用方法,可以很好地与 lambda 配合使用。

    如果您使用 Eclipse Collections 中的 MutableList 作为 moveTracking 列表,代码将如下所示:

    MutableList<MoveTrack> moveTracking = Lists.mutable.empty();
    ObjectDoubleMap<String> doubleMap =
        moveTracking.sumByDouble(MoveTrack::getMonthName, MoveTrack::getMovementAmount);
    

    由您决定在何处以及如何实施getMonthName()。您会注意到sumByDouble 返回一个ObjectDoubleMap。这意味着您可以将double 用于您的movementAmount,并且在求和期间不会被装箱。

    如果您想保持当前的 List&lt;MoveTrack&gt; 类型,您可以使用 ListAdapterIterate 实用程序类来完成同样的事情。

    List<MoveTrack> list = ...;
    ObjectDoubleMap<String> doubleMap =
        Iterate.sumByDouble(list, MoveTrack::getMonthName, MoveTrack::getMovementAmount);
    

    注意:我是 Eclipse Collections 的提交者

    【讨论】:

      【解决方案3】:

      如下使用Collectors.groupingBy

      mveTracking.stream().collect(Collectors.groupingBy(m -> {
                  final Calendar cal = Calendar.getInstance();
                  cal.setTime(m.getTime());
                  final int month = cal.get(Calendar.MONTH);
                  return new DateFormatSymbols().getMonths()[month];
              }, Collectors.summingDouble(MoveTrack::getMovementAmount)));
      

      代码为你;)

      import java.text.DateFormatSymbols;
      import java.util.ArrayList;
      import java.util.Calendar;
      import java.util.Date;
      import java.util.HashMap;
      import java.util.List;
      import java.util.Map;
      import java.util.stream.Collectors;
      
      public class GroupList {
          public static void main(String[] args) {
              List<MoveTrack> mveTracking = new ArrayList<>();
              mveTracking.add(new MoveTrack(new Date(), 10.0d));
              mveTracking.add(new MoveTrack(new Date(), 11.0d));
              Map<String, Double> movMap = new HashMap<>();
              movMap = mveTracking.stream().collect(Collectors.groupingBy(m -> {
                  final Calendar cal = Calendar.getInstance();
                  cal.setTime(m.getTime());
                  final int month = cal.get(Calendar.MONTH);
                  return new DateFormatSymbols().getMonths()[month];
              }, Collectors.summingDouble(MoveTrack::getMovementAmount)));
              System.out.println(movMap);
          }
      }
      
      final class MoveTrack {
      
          private final Date time;
          private final Double movementAmount;
      
          public MoveTrack(final Date time, final Double movementAmount) {
              this.time = new Date(time.getTime());
              this.movementAmount = movementAmount;
          }
      
          public Date getTime() {
              return time;
          }
      
          public Double getMovementAmount() {
              return movementAmount;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-12-26
        • 1970-01-01
        • 2022-01-04
        • 2016-11-15
        • 2013-03-10
        • 2018-10-03
        • 1970-01-01
        • 1970-01-01
        • 2019-09-29
        相关资源
        最近更新 更多