在java中跟随if-else梯的更好的替代方法是什么?

var*_*hal 9 java string optimization if-statement

情况:我正在检查文件名,文件名存储在一个String被调用的变量中str,根据if语句中检查的条件,我设置了一个名为的变量的值mailType.

if(str.contains("template"))
        {                   
          if(str.contains("unsupported"))
              mailType="unsupported";      
              else
                  if(str.contains("final_result"))                
                      mailType="final_result";            
                  else
                      if(str.contains("process_success"))
                          mailType="Process Success"; 
                      else
                          if(str.contains("receive"))                         
                              mailType="Receive";                         
                          else
                          if(str.contains("sen"))
                              mailType="sent"; 
                          else
                              if(str.contains("welcome"))
                                  mailType="welcome";
                              else
                                  if(str.contains("manual"))
                                     mailType="Manual";                    
        }       
        else                
if(str.contains("properties"))
        {

          if(str.contains("unsupported"))
              mailType="unsupported";      
              else
                  if(str.contains("final_result"))                
                      mailType="final_result";            
                  else
                      if(str.contains("process_success"))
                          mailType="Process Success"; 
                      else
                          if(str.contains("receive"))                         
                              mailType="Receive";                         
                          else
                          if(str.contains("sen"))
                              mailType="sent"; 
                          else
                              if(str.contains("welcome"))
                                  mailType="welcome";
                              else
                                  if(str.contains("manual"))
                                     mailType="Manual";

        }
Run Code Online (Sandbox Code Playgroud)

问题:有没有更好的方法在java中缩短我的代码并且内存友好?

And*_*ner 20

使用LinkedHashMap<String, String>:

LinkedHashMap<String, String> mapping = new LinkedHashMap<>();
mapping.put("unsupported", "unsupported");
mapping.put("final_result", "final_result");
// ... etc
Run Code Online (Sandbox Code Playgroud)

然后迭代地图,直到找到匹配的键:

for (Map.Entry<String, String> entry : mapping.entrySet()) {
  if (str.contains(entry.getKey()) {
    mailType = entry.getValue();
    break;
  }
}
Run Code Online (Sandbox Code Playgroud)

这里的关键点是,LinkedHashMap保持插入顺序(不同HashMap),所以实际上你可以指定你想测试匹配的顺序(其它地图的实现就此别过,如番石榴的ImmutableMap,LinkedHashMap仅仅是一个你必须开箱).

如果你需要为外壳嵌套这个,你可以简单地应用相同的模式:

LinkedHashMap<String, LinkedHashMap<String, String>> outerMapping =
    new LinkedHashMap<>();
outerMapping.put("template", mapping);
outerMapping.put("properties", someOtherMapping);
Run Code Online (Sandbox Code Playgroud)

然后以相同的方式迭代键:

for (Map.Entry<String, LinkedHashMap<String, String>> outerEntry : outerMapping.entrySet()) {
  if (str.contains(outerEntry.getKey()) {
    // Apply the iteration above, using outerEntry.getValue().
  }
}
Run Code Online (Sandbox Code Playgroud)

  • @varunsinghal:以上只会使用真正微不足道的更多内存,无需担心.它也很容易维护,而且实际上并不复杂.FWIW,这就是我要做的,或者与它非常相似的东西. (2认同)