Java String trim - 如何最小化

Java String trim - how to minimize

Java 文档说 String.trim() Returns 字符串的副本。

我的方法中有以下代码,它确实 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")){ 
      }
    }

现在,Sonar 报告 Assignments should not be made from within sub-expressions。如何在我的方法中有效地减少 trim 的使用?我很烦恼,因为此方法正在生产中使用并且每秒调用 250 多次,不应不必要地创建更多 String 个对象。

你可以这样写:

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.

中是可用的

最后,如果你不想create/use非标准方法,你可以使用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")){ 
  }
}

拆分您的第一个 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