这个Java搜索可以写得更好吗?



有没有更好的方法来实现这个字符串数组,然后执行循环。更好的我的意思是更有效率?

String[] knownWebClients = new String[]{"chrome", "firefox", "mozilla", "safari", "opera"};
for (String nextKnown : knownWebClients) {
if (uaType.toLowerCase().startsWith(nextKnown)) {
this.uaWebType = uaType;
this.uaType = "MyClient";
}
}

通常,只需使用地图或集合即可加快"查找活动"。但鉴于您不要求完全相等而是"开始",这是不可能的,但迭代该列表。

两件小事:

  • 您可以将该调用移动到循环前面的输入小写
  • 您可以在匹配时中断循环(以避免迭代剩余的列表项(

您可以考虑用简单的正则表达式匹配替换简单的字符串比较 - 但如果考虑到这种匹配,这样的解决方案可以更有效,我会感到相当惊讶。

除此之外 - 你确定你专注于一个真正的问题。除非这段代码每分钟执行数百万次 - 它是否需要 50 ns 或 100 真的重要吗?我要说的是:不要试图修复不存在的性能问题。专注于编写设计良好且人类可读的代码。

您的实际代码会生成更多所需的循环。
一旦找到匹配项,您应该停止并评估当前对象(this(,但您继续循环,如果遇到新的匹配项,则用完全相同的值覆盖当前对象,因为在循环期间存在不变性:

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";
});

将 uaType.to LowerCase(( 移出循环

最新更新