是否有更好的方法来尝试转换为整数的字符串?Integer.parseInt(字符串值)可以很好地处理"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()没有被重载到,在发生错误的参数时返回一个可选的?(或者仅仅向Integer包装器添加一个新方法Integer.parseIntOptional() )
发布于 2017-09-15 14:05:57
与现在被删除的其他答案不同,我认为这与Java向后兼容并没有什么关系。
因为空Optional表示缺少的值,这意味着该方法实际上工作了,但没有返回结果。
但是,将hello解析为整数将不起作用,必须抛出异常,因为是一个错误,而不是一个空结果。请记住,NumberFormatException扩展了IllegalArgumentException。
更普遍地说,Optional是为处理可能缺少的值(而不是使用null )而创建的,而不是用于错误处理。而且,Optional没有提供任何方法来知道错误是什么以及为什么会出现错误。
发布于 2017-09-15 14:01:03
标准库afaik中不存在类似于此的内容,但是您可以编写一个将String解析为如下所示的Optional<Integer>的方法:
public static Optional<Integer> parseInt(String toParse) {
try {
return Optional.of(Integer.parseInt(toParse));
} catch (NumberFormatException e) {
return Optional.empty();
}
}发布于 2017-09-15 15:17:08
我不想推测为什么不存在这样的方法,但是如果您不愿意,执行预测试或捕获异常,则需要重新实现。
public static OptionalInt parseInt(String s) {
if(s.isEmpty()) return OptionalInt.empty();
final int len = s.length(), limit;
final boolean negative;
int i = 0;
switch(s.charAt(0)) {
case '-':
i=1;
if(len==1) return OptionalInt.empty();
negative = true;
limit = Integer.MIN_VALUE;
break;
case '+':
i=1;
if(len==1) return OptionalInt.empty();
// fall-through
default:
negative = false;
limit = -Integer.MAX_VALUE;
}
final int limitBeforeMul = limit / 10;
int result = 0;
for(; i < len; i++) {
int digit = Character.digit(s.charAt(i), 10);
if(digit < 0 || result < limitBeforeMul || (result *= 10) < limit + digit)
return OptionalInt.empty();
result -= digit;
}
return OptionalInt.of(negative? result: -result);
}这基本上与Integer.parseInt相同,但是返回无效字符串的空OptionalInt,而不是抛出异常…。
正如您可能注意到的,最困难的部分是处理接近Integer.MIN_VALUE resp的数字。正确的Integer.MAX_VALUE。
https://stackoverflow.com/questions/46241342
复制相似问题