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));
中就有这样的方法
更通用的解决方案是通过特殊方法将空字符串转换为空:
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
。
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));
中就有这样的方法
更通用的解决方案是通过特殊方法将空字符串转换为空:
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
。