Java: Putting items from List into HashMap efficiently
我在这里有一个清单:
1
| List<QueryStrings> queryStrings |
和QueryStrings只是一个简单的类
我需要将List放入一个HashMap,其中id将是键,我现在这样做,一次循环List一个项:
1 2 3 4 5
| HashMap <Integer, QueryStrings > queryMap = new HashMap <>();
for (QueryStrings element : queryStrings ) {
Integer thisId = Integer. parseInt(element. getId());
queryMap. put(thisId, element );
} |
有更好的方法吗? 我不想循环每个项目,这可能吗?
编辑:
对不起,我不应该解析整数,所以代码应该是这样的:
1 2 3 4
| HashMap <Integer, QueryStrings > queryMap = new HashMap <>();
for (QueryStrings element : queryStrings ) {
queryMap. put(element. getId(), element );
} |
-
我相信这样的东西适用于Java8 Map queryMap = queryStrings.stream().collect(toMap(element.getId(), element));
-
为什么要打电话给parseInt()? id已经是Integer类型,只需直接使用ID。
-
@ScaryWombat id是Interger对吗?为什么我们需要解析
-
如当前答案中所述,减去额外的呼叫,循环与任何其他方法一样"有效"。定义"更好的方式"。
-
你到底想要什么?你问这个问题,然后编辑它以忽略答案?您真的想要性能指标吗?或者只是一瞥?优化可读性?
-
@RyanTheLeach,抱歉不清楚,我想要一个更好的方法来填充地图而不是循环每个项目。
-
"更好"的地图不会神奇地填充自己,循环必须在某个地方发生,只是如果你这样做,或者你调用的方法。在创建列表的同时创建列表,在同一个循环内部(这会增加循环的复杂性,可能使jvm更难以优化btw),您将需要定义实际需要改进的内容。
-
如果您在许多类中多次执行此操作,则可能会引入一个"Identifyable"接口,该接口具有单个抽象方法,该方法返回一个ID,然后定义一个泛型方法,该方法输出的地图因类型而异。插入列表。但目前还没有足够的背景可以作为一个合理的答案。在这种情况下,您有XY问题。
-
这不值得担心。只要哈希码不是简并的,您就可以将数百万个项目填充到每秒HashMap。
如果它已经是int,请不要解析int!
1 2 3 4
| HashMap <Integer, QueryStrings > queryMap = new HashMap <>();
for (QueryStrings element : queryStrings ) {
queryMap. put(element. getId(), element );
} |
也就是说,如果它是Java 8,您可以使用更简洁的语法,尽管性能差异很小。
1
| list.stream().collect(Collectors.toMap(QueryStrings::getId, Function.identity())); |
-
他的班级确实将它显示为整数
-
没有抓到 - 绝对是一个更好的方法是不要从整数 - >字符串 - >整数:-)