使用lambda表达式的int回文

Palindrome of int using lambda expression

有没有更好的方法来查找一个整数是回文还是不使用 lambda 表达式。我尝试过类似的方法,它有效但正在寻找更好的方法。

public static boolean isPalindrome(int number) {

    return number == IntStream.iterate(number, i -> i / 10)
        .map(n -> n % 10)
        .limit(String.valueOf(number).length())
        .reduce(0, (a, b) -> a = a * 10 + b);
}

有一种更简单的方法来判断一个整数是否为回文,但由于这个问题仅限于使用 lambda 表达式,因此我只会建议改进您当前的解决方案。

不幸的是,对于 JDK-8,您需要使用 limit 来截断无限流。但是,从 JDK-9 开始,有一个带有签名的 iterate 方法:

static <T> Stream<T> iterate(T seed,
                             Predicate<? super T> hasNext,
                             UnaryOperator<T> next)

因此,您现在可以:

而不是 .limit(String.valueOf(number).length())
return number == IntStream.iterate(number, n -> n != 0, i -> i / 10)
                          .map(n -> n % 10)
                          .reduce(0, (a, b) -> a * 10 + b);

请注意,在 reduce 中执行 a = a * 10 + b 是多余的,因此我已将其更改为 a * 10 + b,如上所示。

您可以将数字转换为字符串并检查反向字符串是否相等。

return number -> Integer.toString(number)
                          .equals(new StringBuilder(Integer.toString(number))
                            .reverse().toString());

或者

return number -> String.valueOf(number).equals(new StringBuilder(String.valueOf(number)).reverse().toString());

如果你有10位数字,你需要比较一半才能知道给定的数字是否是回文。我们将数字转换为字符串,然后将长度除以 2,然后比较左侧字符与右侧字符(意味着第 0 个字符应与最后一个字符匹配,其他索引的方式相同,从左到右比较字符)一旦比较失败我们可以 return false 而不是检查所有其他字符,这样我们就可以减少一半的时间。

int num = 121;
        String temp = Integer.toString(num);
        boolean val = IntStream.range(0,temp.length()/2).noneMatch(i -> temp.charAt(i) != temp.charAt(temp.length()-i-1));
        System.out.println("result "+val);