由于某种原因,我使用了复制语句,但不知怎的,我觉得效率低下。我使用duplicated for statement的原因如下。
Map<String, Object>
'类型,其中包含许多元素Map<String, Object>
列表源代码在
之下public static void injectProgram2Channel (
List<Map<String, Object>> channelList, List<Map<String, Object>> programList) throws Exception {
for(Map<String, Object> channel : channelList){
String serviceId = channel.get("serviceId").toString();
ArrayList<Map<String, Object>> programsForChannel = new ArrayList<Map<String,Object>>();
for(Map<String, Object> program : programList){
if(serviceId.equals(program.get("serviceId").toString())){
programsForChannel.add(program);
}
}
channel.put("programs", programsForChannel);
}
}
我不想迭代所有这个List,因为每个List都有很多元素。如何改善其表现?
(我需要不使用重复语句的解决方案)
答案 0 :(得分:0)
你需要问自己一个问题:它的速度有多快。如果没有,请不要使代码更复杂。 “过早优化是所有邪恶的根源。”
确认效果相关后,请尝试创建基准,例如使用JMH并使用它,开始优化。
答案 1 :(得分:0)
Channel List has around 500 Elements
Program List has around 2000 Elements
这些在真实世界的应用程序中非常小。如果你只有两个嵌套的for循环用于那个数据量,你不应该担心。
答案 2 :(得分:0)
正如暗示可能或可能在您的情况下有意义的可能选项,只需将 serviceId 的程序分组为新的Map<String, List<Map<String, Object>>>
并在需要时查找程序。
public static Map<String, List<Map<String, Object>>> buildProgramList (
List<Map<String, Object>> programList) throws Exception {
Map<String, List<Map<String, Object>>> programsByServiceId = new HashMap<>();
for(Map<String, Object> program : programList){
String serviceId = program.get("serviceId").toString();
if(programsByServiceId.containsKey(serviceId)){
programsByServiceId.get(serviceId).add(program);
} else {
programsByServiceId.put(serviceId,
new ArrayList<Map<String, Object>>(){{
add(program);
}});
}
}
return programsByServiceId;
}
构建此结构后,只需通过调用
检索频道的程序List<Map<String, Object>> programs = programsByServiceId.get(channel.get("serviceId").toString());
如果你想获得额外的幻想,你可以将结果延迟加载到频道。像
这样的东西if (channel.get("programs") == null)
channel.put("programs", programsByServiceId.get(channel.get("serviceId").toString());
return channel.get("programs");
这会推迟前期成本并将其分散。
当可能有意义时。如果某些频道在计划列表中比其他频道更频繁地查找。
当这没有意义时。所有频道都会立即被要求列出程序或很快。 (就像你只是要序列化所有频道及其节目一样)。