如何以功能方式将字符串中的数字求和直到特定索引

Mar*_*tin 1 java functional-programming java-stream java-11

我想总结来自例如的数字。String像 "153" 直到索引 2 并6因为 1+5=6而收到结果。在正常情况下,我会使用经典的循环解决方案,例如检查当前索引是否低于 2:

static int sum(String s){
       int sum = 0;
        for(int i = 0; i < s.length() ; i++){
            if( Character.isDigit(s.charAt(i)) ){
                sum = sum + Character.getNumericValue(s.charAt(i));
            }
        }
        return sum;
}
Run Code Online (Sandbox Code Playgroud)

上面的方法可以正常工作,但我想将此逻辑重写为 Javastream方法。

我有一个实现,如:

  public static int sumDigitsTillIndex(String number) {
    return IntStream.range(0, number.length())
        .filter(i -> i < 2)
        .map(number::charAt)
        .sum();
  }
Run Code Online (Sandbox Code Playgroud)

对于这个参数 153,我收到了 102,这对我来说是一个惊喜。

我找到了另一个类似的解决方案,例如:

   return String
    .valueOf(number)
    .chars()
    .map(Character::getNumericValue)
    .sum();
Run Code Online (Sandbox Code Playgroud)

这是正确地对数字求和,但使用其他filter方法,例如: .filter(index -> number.charAt(index) < 2) 我正在接收 Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 49

我将不胜感激有关如何修复上述这两个解决方案并接收功能方法的建议,该方法将从字符串到特定索引的数字求和。

Had*_*i J 5

你可以做:

number.chars()
      .limit(2)
      .map(Character::getNumericValue)
      .sum();
Run Code Online (Sandbox Code Playgroud)

或者

number.substring(0, 2)
            .chars()
            .map(Character::getNumericValue)
            .sum();
Run Code Online (Sandbox Code Playgroud)