情况:我正在检查文件名,文件名存储在一个名为str的String变量中,根据检查的条件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"; }
问题:在java中有没有更好的方式来缩短我的代码并且内存友好?
解决方法
使用LinkedHashMap< String,String> ;::
LinkedHashMap<String,String> mapping = new LinkedHashMap<>(); mapping.put("unsupported","unsupported"); mapping.put("final_result","final_result"); // ... etc
然后迭代地图,直到找到匹配的键:
for (Map.Entry<String,String> entry : mapping.entrySet()) { if (str.contains(entry.getKey()) { mailType = entry.getValue(); break; } }
关键点在于LinkedHashMap保留插入顺序(与HashMap不同),因此您可以实际指定要测试匹配的顺序(其他地图实现也可以这样做,例如Guava’s ImmutableMap; LinkedHashMap只是一种盒子).
如果你需要嵌套外部的情况,你可以简单地应用相同的模式:
LinkedHashMap<String,LinkedHashMap<String,String>> outerMapping = new LinkedHashMap<>(); outerMapping.put("template",mapping); outerMapping.put("properties",someOtherMapping);
然后以相同的方式迭代键:
for (Map.Entry<String,String>> outerEntry : outerMapping.entrySet()) { if (str.contains(outerEntry.getKey()) { // Apply the iteration above,using outerEntry.getValue(). } }