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
个对象。
答案 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
。