首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Java 8中不尝试捕获到parseInt的方法?

在Java 8中不尝试捕获到parseInt的方法?
EN

Stack Overflow用户
提问于 2017-09-15 13:57:11
回答 6查看 12.2K关注 0票数 8

是否有更好的方法来尝试转换为整数的字符串?Integer.parseInt(字符串值)可以很好地处理"25“或"019”,而不是"hello“或"8A”。在Java 8中,我们有可选的值,例如:

代码语言:javascript
运行
复制
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,或者不包含有效的整数,则解决方案与往常一样:

代码语言:javascript
运行
复制
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() )

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-09-15 14:05:57

与现在被删除的其他答案不同,我认为这与Java向后兼容并没有什么关系。

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

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

更普遍地说,Optional是为处理可能缺少的值(而不是使用null )而创建的,而不是用于错误处理。而且,Optional没有提供任何方法来知道错误是什么以及为什么会出现错误。

票数 11
EN

Stack Overflow用户

发布于 2017-09-15 14:01:03

标准库afaik中不存在类似于此的内容,但是您可以编写一个将String解析为如下所示的Optional<Integer>的方法:

代码语言:javascript
运行
复制
public static Optional<Integer> parseInt(String toParse) {
    try {
        return Optional.of(Integer.parseInt(toParse));
    } catch (NumberFormatException e) {
        return Optional.empty();
    }
}
票数 16
EN

Stack Overflow用户

发布于 2017-09-15 15:17:08

我不想推测为什么不存在这样的方法,但是如果您不愿意,执行预测试或捕获异常,则需要重新实现。

代码语言:javascript
运行
复制
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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46241342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档