我可以在这里做什么来检测两种方法中的重复项

What can i doing here to detect the duplicate in the two methods

两种方法intValueOfintValueOfOptional,非常相似。 我想修改实现,使这两种方法使用尽可能少的重复代码。

这两种方法都包含一个非常复杂的条件。我怎样才能简化它们, 条件的语义相关部分转换为具有有意义名称的变量?

为此我应该使用 IntelliJ 的哪些重构?

public static int intValueOf(String str) {
    int idx = 0;
    int end;
    boolean sign = false;
    char ch;
    
    if ((str == null) || ((end = str.length()) == 0) || ((((ch = str.charAt(0)) < '0') || (ch > '9')) && (!(sign = ch == '-') || (++idx == end) || ((ch = str.charAt(idx)) < '0') || (ch > '9')))) {
        throw new NumberFormatException(str);
    }

    int ival = 0;
    for (; ; ival *= 10) {
        ival += '0' - ch;
        if (++idx == end) {
            return sign ? ival : -ival  ;
        }
        if (((ch = str.charAt(idx)) < '0') || (ch > '9')) {
            throw new NumberFormatException(str);
        }
    }
}




public static Optional<Integer> intValueOfOptional(String str) {
    int idx = 0;
    int end;
    boolean sign = false;
    char ch;

    if ((str == null) || ((end = str.length()) == 0) || ((((ch = str.charAt(0)) < '0') || (ch > '9')) && (!(sign = ch == '-') || (++idx == end) || ((ch = str.charAt(idx)) < '0') || (ch > '9')))) {
        return Optional.empty();
    }

    int ival = 0;
    for (; ; ival *= 10) {
        ival += '0' - ch;
        if (++idx == end) {
            return Optional.of(sign ? ival : -ival);
        }
        if (((ch = str.charAt(idx)) < '0') || (ch > '9')) {
            return Optional.empty();
        }
    }
}

}

您不需要任何工具,只需查看代码中的区别即可。这是相同的逻辑,尽管当它不是有效的 int 时抛出,而另一个 returns 是空的 Optional.

只需利用其中一个,例如

public static int intValueOf(String str) {
   return intValueOfOptional(str).orElseThrow(() -> new NumberFormatException(str));
}