我有一个小方法,除此之外还可以将字符串转换为整数。由于该字符串是该方法的参数,我想确保该字符串是可转换的。所以我只是想知道什么是最安全和/或最快的方法。
版本A:保持原样并承担风险(我试图避免)
public static int stringToInt(String param) {
return Integer.valueOf(param);
}
(从速度上来说,B版和C版会有什么样的区别?)
版本B:捕获异常
public static int stringToInt(String param) {
try {
return Integer.valueOf(param);
} catch(NumberFormatException e) {
return -1;
}
}
版本C:检查字符串的每个字母,看看它是否是数字
public static int stringToInt(String param) {
for(char c : param.toCharArray()) {
if(!Character.isDigit(c))
return -1;
}
return Integer.valueOf(param);
}
请注意,参数必须是正数,-1 应该是我的小程序中的“错误值”,换句话说,所有三个版本的方法都可以在我的程序中完美运行。
我非常乐意接受您给我的任何其他建议,因此,如果您认为自己的版本更好,请随意创建您自己的版本。
非常感谢您提前的支持。
Guava 为此提供了一个实用方法,如果您的字符串无法解析,该方法将返回 null。
Integer result = Ints.tryParse("1"); //returns 1
Integer result = Ints.tryParse("-1"); //returns -1
Integer result = Ints.tryParse("a"); //returns null
首先,请注意版本
C
并不是万无一失的:它会拒绝负数,并且不会捕获太大的数字。
版本
B
是可以的,但它使调用者改变编码风格:调用者需要始终检查-1
,而不是捕获错误并将其与其他错误一起处理。在读取多个整数的情况下,这可能不是最佳的,但错误处理并不取决于哪一个特定的整数失败。此外,使用您的 API 的新编码员可能会忘记检查 -1
,并无意中使用错误代码。
这就是为什么我会保留第一个选项:使用版本
A
的代码对于任何了解 Java API 的人来说都会立即看起来很熟悉,而无需了解函数内部发生的情况。
我相信修改 B 来抛出异常而不是返回 -1 将是最好的选择。最好将异常抛出到可以对其进行处理以向用户发送正确响应的级别。返回像 -1 这样的值会让你的代码容易出错。假设另一个程序员正在使用您的方法,并且他/她只有您方法的签名。因此,从签名中并不清楚他/她应该编写什么代码来处理异常或错误情况。但是,如果您抛出异常并将其添加到方法声明中,那么其他程序员将能够正确使用您的方法以及所需的异常处理。对我来说,这看起来是最好的:
public static int stringToInt(String param) throws NumberFormatException {
try {
return Integer.valueOf(param);
} catch(NumberFormatException e) {
// return -1;
throw e;
}
}
没有任何 API 的 Java 8:
Optional.ofNullable(strNum)
.map(Integer::valueOf).orElse(null);
public int stringToInt(String param) throws NumberFormatException {
Optional.ofNullable(param.replaceAll("\\s+", ""))
.map(Integer::valueOf).orElse(null);
/*
or
Optional.ofNullable(param.replaceAll(" ", ""))
.map(Integer::valueOf).orElse(null);
*/
}
使用replaceAll来替换空格,尽管似乎不需要,但加号对CPU是友好的。
我使用了 2 个答案的组合,以保证空值、空字符串或空白字符串以及非数字字符的安全性:
public static Integer safeStringToInt(String param) {
return Optional.ofNullable(param).map(Ints::tryParse).orElse(null);
}
我希望这对某人有帮助:
请注意: StringUtils 来自 'org.apache.commons.lang3.StringUtils'
public static void main(String[] args) {
String nullable = "";
Integer result = Optional.ofNullable("").filter(StringUtils::isNotBlank).map(Integer::valueOf).orElse(0);
System.out.println("Result1: " + result);
nullable = null;
result = Optional.ofNullable(nullable).filter(StringUtils::isNotBlank).map(Integer::valueOf).orElse(0);
System.out.println("Result2: " + result);
nullable = "6";
result = Optional.ofNullable(nullable).filter(StringUtils::isNotBlank).map(Integer::valueOf).orElse(0);
System.out.println("Result3: " + result);
nullable = "a";
result = Optional.ofNullable(nullable).filter(StringUtils::isNotBlank)
.filter(StringUtils::isNumeric).map(Integer::valueOf).orElse(0);
System.out.println("Result4: " + result);
}
Output:
Result1: 0
Result2: 0
Result3: 6
Result4: 0