可以更好地编写此Java搜索

时间:2017-07-21 17:29:13

标签: java lambda

是否有更好的方法来实现此字符串数组然后执行循环。我的意思是更有效?

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

3 个答案:

答案 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()移出循环