Java String trim - 如何最小化

时间:2015-08-17 05:19:27

标签: java string sonarqube trim

Java doc说String.trim()返回字符串的副本。

我的方法中有以下代码,如上所述它会trim,导致创建新字符串三次。

String foo = getFoo(storedProcedureResult);
if(foo !=null && !foo.trim().isEmpty()){ // --> creates new string
  if(foo.trim().substring(1).equals("bar")){ // --> creates new string
  } else if(foo.trim().substring(4,6).equals("bar")){ // --> creates new string
  }
}

我尝试使用以下代码将此内容最小化:

 String foo = getFoo(storedProcedureResult);
    if(foo !=null && !(foo=foo.trim()).isEmpty()){ // --> creates new string only once
      if(foo.substring(1).equals("bar")){ 
      } else if(foo.substring(4,6).equals("bar")){ 
      }
    }

现在,声纳报告Assignments should not be made from within sub-expressions。如何在我的方法中有效地最小化trim的使用?我很烦,因为这个方法正在生产中使用,每秒调用250次以上,不应该不必要地创建更多String个对象。

2 个答案:

答案 0 :(得分:1)

你可以写:

String foo = getFoo(storedProcedureResult);
if(foo != null) foo = foo.trim();
if(foo !=null && !foo.isEmpty()){
  if(foo.substring(1).equals("bar")){ 
  } else if(foo.substring(4,6).equals("bar")){ 
  }
}

您还可以为此创建实用程序方法:

static String safeTrim(String s) {
    return s == null ? null : s.trim();
}

并使用它:

String foo = safeTrim(getFoo(storedProcedureResult));

实际上这种方法存在于Apache Commons Lang

更通用的解决方案是通过特殊方法将空字符串转换为空:

static String nullToEmpty(String s) {
    return s == null ? "" : s;
}

并像这样使用它:

String foo = nullToEmpty(getFoo(storedProcedureResult)).trim();
if(!foo.isEmpty()){
  if(foo.substring(1).equals("bar")){ 
  } else if(foo.substring(4,6).equals("bar")){ 
  }
}

实际上这种方法可以在Google Guava中找到。

最后,如果您不想创建/使用非标准方法,可以使用Java-8 Optional

String foo = Optional.ofNullable(getFoo(storedProcedureResult))
                     .map(String::trim).orElse("");
if(!foo.isEmpty()){
  if(foo.substring(1).equals("bar")){ 
  } else if(foo.substring(4,6).equals("bar")){ 
  }
}

答案 1 :(得分:0)

拆分您的第一个if声明。以下假设您要保留原始foo

String foo = getFoo(storedProcedureResult);
if (foo != null) {
    String trimmedFoo = foo.trim();
    if (! trimmedFoo.isEmpty()) {
        if (trimmedFoo.substring(1).equals("bar")) {
            // do something here
        } else if (trimmedFoo.length() >= 6 && trimmedFoo.substring(4,6).equals("bar")) {
            // do something here
        }
    }
}

对于短于6个字符的字符串,代码也在防范IndexOutOfBoundsException