【发布时间】:2021-01-29 05:43:04
【问题描述】:
我需要根据对象的某些成员对对象列表进行分组。让我通过一个例子来展示我想要实现的需求:
我有一个 UserStage 类:
public class UserStage {
private Integer userId;
private Integer stageId;
private LocalDateTime modifiedOn;
//getter, setter and toString methods
}
现在假设我有一个List<UserStage>,它可以为同一个用户 ID 提供多个对象。我们称之为 userStageDataList。
我想按 userId 对这个列表进行分组,以便我可以获得特定 userId 的所有记录的列表。这可以通过不同的方法来实现,但我尝试实现的方法如下:
Map<Integer, List<UserStage>> userWiseStageList = new HashMap<>();
for (UserStage userStage : userStageDataList) {
userWiseStageList.computeIfAbsent(userStage.getUserId(), ArrayList::new).add(userStage);
}
但这里让我感到惊讶的是,对于列表中的 75 个项目,执行此操作始终需要大约 3000 毫秒。有时它会抛出java.lang.OutOfMemoryError: Java heap space。
当我将 ArrayList::new 替换为 k -> new ArrayList<>() 时,现在创建分组只需要 3 到 4 毫秒。
我尝试使用streams 使用groupingBy,对于同一个列表,它也在 5-7 毫秒内很好地执行。
我使用以下代码来测量执行时间:
StopWatch watch = new StopWatch();
watch.start();
// here goes map creation code as shown above
logger.info("\n\n\n time taken for creating the map = {}",watch.getTime(TimeUnit.MILLISECONDS));
我在这里错过了什么吗?任何建议将不胜感激!
谢谢。
【问题讨论】:
标签: java arraylist lambda java-8 hashmap