Java 8替代字符串中奇数位置的字符总和?

时间:2017-03-11 21:50:40

标签: java string java-8 java-stream

很想知道在Java 8中是否有更优雅的方法来尝试查找字符串中奇数位置的数字总和。

这是我目前的职能

 /**
 * Explode string into char array, get sum of ASCII values at odd positions and divide by 10 to convert
 * to the integer value from that character
 * @param ccNumber string
 * @return int sum
 */
int calculateSumOfOddDigits(final String ccNumber) {
    final char[] digits = ccNumber.toCharArray();
    return (digits[0] + digits[2] + digits[4] + digits[6] + digits[8] + digits[10] + digits[12] + digits[14]) / 10;
}

仍然不熟悉Streams和Java 8,并认为你可以这样做:

 ccNumber.chars().mapToObj(x -> (char) x {
        ..add odd position digits

    })

欢迎任何建议。

3 个答案:

答案 0 :(得分:8)

这样的事情:

String str = "01234";
Integer sum = IntStream.range(0, str.length())
                       .filter(i -> i % 2 == 0)
                       .map(str::charAt)
                       .sum();
System.out.println(sum);

答案 1 :(得分:3)

问题是:如果你想过滤索引,那么转换为字符流是没用的,因为你丢失了索引信息。

但是,您可以将索引视为流,并使用.map()将其转换为char值。像这样的东西:call_user_func_array

IntStream.range(0, ccNumber.length())
  .filter(i -> i % 2 == 0)
  .map(i -> ccNumber.charAt(i))
  .collect(Collectors.sum());

不确定这是否正常,但你明白了。

另外:这并不像简单的for循环那样有效,所以我不会那么麻烦这样做。

答案 2 :(得分:2)

Instream.range(0, str.length())
    .filter(i -> i % 2 == 0)
    .map(i -> str.charAt(i))
    .sum();