在Java 8中没有try-catch的parseInt的方法?

C.P*_*P.O 4 java java-8

有没有更好的方法尝试将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();
}
Run Code Online (Sandbox Code Playgroud)

您不需要检查空值,因为Optional包装器公开了处理这种情况的有用方法.

但是,如果您想要parseInt一个字符串,可以为null,或者不包含有效整数,则解决方案与以下内容完全相同:

public static Integer parseIntOrDefault(String toParse, int defaultValue) {
    try {
        return Integer.parseInt(toParse);
    } catch (NumberFormatException e) {
        return defaultValue;
    }
}
Run Code Online (Sandbox Code Playgroud)

如何利用Java 8功能改进这一点,为什么Integer.parseInt()没有重载以在出现错误参数时返回Optional?(或者只是将一个新方法Integer.parseIntOptional()添加到Integer包装器中)

Fel*_*elk 11

有标准库AFAIK不存在这样的事,但你可以写一个解析的方法StringOptional<Integer>这样的:

public static Optional<Integer> parseInt(String toParse) {
    try {
        return Optional.of(Integer.parseInt(toParse));
    } catch (NumberFormatException e) {
        return Optional.empty();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 乔纳森(Jonathan)的答案实际上包含一个合理的理由,说明标准库中可能不存在这样的方法。 (2认同)

Jon*_*han 8

现在删除的其他答案不同,我认为这与Java向后兼容无关.

因为空Optional表示缺少,这意味着该方法实际工作但没有返回结果.

但是,解析hello为整数将不起作用并且必须抛出异常,因为它是错误而不是空结果.请记住,NumberFormatException扩展IllegalArgumentException.

更一般地说,Optional是为了处理可能缺少的值(而不是null用于此),而不是用于错误处理.此外,Optional没有提供任何方式来了解错误是什么以及为什么存在错误.

  • 我认为"可选"并不是为了处理可能的"null"值本身而是为了取代使用空值来表达可能缺席值的做法. (2认同)