是否有更好的方法来实现此字符串数组然后执行循环。我的意思是更有效?
String[] knownWebClients = new String[]{"chrome", "firefox", "mozilla", "safari", "opera"};
for (String nextKnown : knownWebClients) {
if (uaType.toLowerCase().startsWith(nextKnown)) {
this.uaWebType = uaType;
this.uaType = "MyClient";
}
}
答案 0 :(得分:2)
通常只需使用地图或集合即可加快“查找活动”。但鉴于你没有要求确切的相等,但“从”开始“是不可能的,但迭代该列表。
两件小事:
你可以考虑用简单的正则表达式匹配来替换简单的字符串比较 - 但是如果这种解决方案在这种匹配下更有效,我会感到非常惊讶。
除此之外 - 你确定你专注于一个真正的问题。除非这段代码每分钟执行数百万次 - 如果它需要50 ns或100真的重要吗?我的意思是:不要试图解决现有的性能问题。专注于编写设计良好且人性化的代码。
答案 1 :(得分:2)
您的实际代码会生成更多需要的循环。
一旦找到匹配,你就应该停止并重新定义你当前的对象(这个),但你继续循环,如果你遇到新的匹配,你用完全相同的值覆盖当前对象,因为在循环期间有不变量:
this.uaWebType = uaType;
this.uaType = "MyClient";
在循环之前声明 uaType
并且“MyClient”是常量。
没有流,您的代码应该是:
for (String nextKnown : knownWebClients) {
if (uaType.toLowerCase().startsWith(nextKnown)) {
this.uaWebType = uaType;
this.uaType = "MyClient";
break;
}
}
使用流,您可以使用与findFirst()
链接的ifPresent()
在第一次匹配发生后立即应用处理一次:
Arrays.stream(knownWebClients)
.filter(known -> uaType.toLowerCase().startsWith(known))
.findFirst()
.ifPresent((s) -> {
this.uaWebType = uaType;
this.uaType = "MyClient";
});
答案 2 :(得分:0)
将uaType.toLowerCase()移出循环