【发布时间】:2017-09-15 13:57:11
【问题描述】:
有没有更好的方法来尝试将一个可以是或不是整数的字符串转换为 int? Integer.parseInt(String value) 适用于“25”或“019”,但不适用于“hello”或“8A”。 在 Java 8 中,我们有可选值,例如:
public static void main(String[] args) {
Optional<Integer> optionalResult = functionThatReturnsOptionalInteger();
Integer finalValue = optionalResult.orElse(0);
System.out.println(finalValue);
}
public static Optional<Integer> functionThatReturnsOptionalInteger() {
Integer[] ints = new Integer[0];
return Stream.of(ints).findAny();
}
您不需要检查空值,因为Optional 包装器公开了处理这种情况的有用方法。
但是如果你想parseInt一个字符串,那可以为null,或者不包含有效的整数,解决方法和往常一样:
public static Integer parseIntOrDefault(String toParse, int defaultValue) {
try {
return Integer.parseInt(toParse);
} catch (NumberFormatException e) {
return defaultValue;
}
}
如何使用 Java 8 功能改进这一点,为什么 Integer.parseInt() 没有被重载 以 return an Optional 以防参数错误? (或者只是将一个新方法 Integer.parseIntOptional() 添加到 Integer 包装器)
【问题讨论】:
-
那将不允许旧代码在新版本上编译。
-
“覆盖”到底是什么意思?你的意思是替换,还是只是重载(在现有的
parseInt方法上添加了一个Optional-variant (我知道重载在这里不起作用)) -
@Felk,是的,抱歉,超载了!
-
我发现 Integer.parseInt("hello") 抛出
NumberFormatException比返回Optional.empty()更直观 -
好的。附带说明:重载在这里不起作用,因为您不能仅通过具有不同的返回类型来重载。添加说
Optional-variant 将需要不同的方法名称。虽然不会改变核心问题