我会尽量保持清醒。
我有N个对象列表。每个对象都存储一个ID字段和一个值字段。
LIST A | ID1 v1 | ID2 v2 | ID3 v3 |
LIST B | ID1 v1' | ID2 v2' | ID3 v3' |
LIST C | ID1 v1''| ID2 v2''| ID3 v3''|
我需要创建一个哈希映射
Map<Integer,List<Double>>
像这样:
------------------------
| ID1 | v1 v1' v1'' |
| ID2 | v2 v2' v2'' |
| ID3 | v3 v3' v3'' |
------------------------
对于每个列表,我现在使用此代码:
object_list.forEach( v -> {
String id = v.getID();
Double value = v.getValue();
if(map.containsKey(id)){
map.get(id).add(value);
}
else{
List<Double> list = new ArrayList<>();
list.add(value);
map.put(id, list);
}
});
我的问题:我能以更快的方式执行此操作吗?
由于
答案 0 :(得分:8)
你可以使用Java 8的方便computeIfAbsent
方法非常有表现力地做到这一点:
objectList.forEach( v -> {
List<Double> doubleList = map.computeIfAbsent(v.getID(), k->new ArrayList<>());
doubleList.add(v.getValue());
});
请注意,这不一定比原始解决方案运行得更快。它的优点是阅读更清晰。
答案 1 :(得分:6)
使用番石榴的多重映射会更直接。
ListMultimap<Integer, Double> multimap = ArrayListMultimap.create();
然后你可以put()
,番石榴为你处理剩下的事情:
String id = v.getID();
Double value = v.getValue();
multimap.put(id, value);
如果id存在,则将值添加到其中,否则将创建新密钥。
答案 2 :(得分:3)
问题是:你为什么对目前的表现不满意?
您是否对当前代码进行了基准测试?
此代码是否运行超过;说每分钟10K次?
您的用户是否抱怨性能问题;你仔细分析并发现这段代码是罪魁祸首吗?
如果您使用 no 回答了所有这些问题,那么您可能没有遇到任何问题。
鉴于你真的有问题;当然,Kiltos的解决方案可能会有所缓解。但我认为你应该更进一步,研究整体数据流。例如:您假设您花费了大量时间从现有列表中检索此数据。也许你应该调查,如果你可以避免建立初始列表;而是以一种首先需要较少转换工作的方式提供所需数据!
此外:您已经在使用流。也许你可以在这里并行!
答案 3 :(得分:1)
如果N个项目的意思是他们的数字是固定的,那么你可以创建一个大小的地图,当满满时不会扩展。
Map<Integer,List<Double>> map = new HashMap<Integer,List<Double>>(N, 1);