Java:高效地将List中的项目放入HashMap

8

我这里有一个列表:

List<QueryStrings> queryStrings

而QueryStrings只是一个简单的类。
public class QueryStrings {
    private Integer id;
    private String rel;
    private String impl;
}

我需要将List放入HashMap中,其中id将作为键。我现在正在这样做,逐个遍历List:

HashMap<Integer, QueryStrings> queryMap = new HashMap<>();
for (QueryStrings element : queryStrings) {
    Integer thisId = Integer.parseInt(element.getId());
    queryMap.put(thisId, element);
}

有更好的方法吗?我不想循环每个项目,这可能吗?
编辑:抱歉我不应该解析整数,所以代码应该像这样:
HashMap<Integer, QueryStrings> queryMap = new HashMap<>();
for (QueryStrings element : queryStrings) {
    queryMap.put(element.getId(), element);
}

除了当前答案中提到的额外调用之外,循环与任何其他方法一样“高效”。请定义“更好的方式”。 - user2864740
你到底在寻找什么?你问问题,然后编辑它来忽略答案吗?你真的想要性能指标吗?还是只是想要一个快速浏览?优化可读性? - Ryan Leach
@RyanTheLeach,抱歉没有表达清楚,我想找到一种更好的方法来填充映射而不是循环每个项。 - Steven Yong
如果你在许多类中多次进行此操作,那么你可以引入一个名为"Identifyable"的接口。该接口包含一个返回ID的抽象方法,然后定义一个通用方法,输出一个根据插入的列表类型不同而变化的映射表。但是现在还远远没有足够的上下文来进行合理的回答。在这种情况下,你遇到了XY问题。 - Ryan Leach
2
这不值得担心。只要哈希码不退化,你可以每秒将数百万个项目填充到 HashMap 中。 - user207421
显示剩余4条评论
1个回答

7

如果已经是int类型,不要解析int!

HashMap<Integer, QueryStrings> queryMap = new HashMap<>();
for (QueryStrings element : queryStrings) {
    queryMap.put(element.getId(), element);
}

话虽如此,如果您在使用Java 8,则可以拥有更简洁的语法,尽管性能差异很小。

list.stream().collect(Collectors.toMap(QueryStrings::getId, Function.identity()));

他的类将其显示为整数。 - J. Knight
没有听清楚 - 肯定有更好的方法,不是从整数 -> 字符串 -> 整数 :-) - Scary Wombat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接