gpt4 book ai didi

java - 从对象列表中获取最后更新记录时使用 map 的正确方法是什么

转载 作者:太空宇宙 更新时间:2023-11-04 09:34:19 25 4
gpt4 key购买 nike

以下两种从列表中获取最后更新记录的方法有什么区别,哪一种更好,为什么?

示例 -假设消息列表按顺序包含消息对象的记录:

Message
{
Integer id ;
String name ;
}

并且名为“messages”的列表中的值包含

[1 , "a"],[2, "b"],[1 , "b"],[1, "c"]

结果应该只包含这两条记录 -

[2, "b"] ,[1, "c"]

解决方案1 ​​-

Map<Integer,String> latestMessage = new HashMap<>();
for (Message m : messages) {
latestMessage.put(m.getId(), m.getName());
}

解决方案 2 -

Map<Integer,String> latestMessage = new HashMap<>();
for (Message m : messages) {
if(!latestMessage.containsKey(m.getId())) {
latestMessage.put(m.getId(), m.getName());
}
else {
latestMessage.replace(m.getId(), m.getName()) ;
}
}

最佳答案

我会选择前者 (put),因为您没有使用该消息,甚至没有尝试合并(由于 Java 8 和 merge 方法,我强调这一点):

你也不会做这样的事情:

Map<String, List<String>> map = ...;
for (Message m : messages)
map.computeIfAbsent(m.getId(), k -> new ArrayList<>()).add(m.getName());

如果是的话,您可能应该使用 StreamgroupingBy ,如下所示:

messages.stream()
.collect(groupingBy(Message::getId, Message::getName));

回到你的两个用例:

  • 使用 put 也更短,更容易理解:后者(containsKey + put/replace)会更难理解(不是更难,但您仍然必须阅读代码才能理解它)。
  • 就性能而言,使用 put 应该比检查映射是否存在快一点,因为您执行的操作要多一些。我不会为此而生气,但你必须编写一个基准(使用 JMH)来比较哪个更好。

TL;DR:使用 put 除非你能证明 containsKey + put/replace 更好。

关于java - 从对象列表中获取最后更新记录时使用 map 的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56694244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com