如何在java中改进低效的重复语句

时间:2014-04-09 01:45:53

标签: java for-loop performance

由于某种原因,我使用了复制语句,但不知怎的,我觉得效率低下。我使用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都有很多元素。如何改善其表现?

  • 频道列表有大约500个元素
  • 程序列表有大约2000个元素

(我需要不使用重复语句的解决方案)

3 个答案:

答案 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");

这会推迟前期成本并将其分散。

可能有意义时。如果某些频道计划列表中比其他频道更频繁地查找。

当这没有意义时。所有频道都会立即被要求列出程序很快。 (就像你只是要序列化所有频道及其节目一样)。