如何以功能方式将字符串中的数字相加到特定索引

How to sum digits in String till specific index in functional way

我想对例如中的数字求和。 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;
}

上述方法可以正常工作,但我想将此逻辑重写为 Java stream 方法。

我有这样的实现:

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

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

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

   return String
    .valueOf(number)
    .chars()
    .map(Character::getNumericValue)
    .sum();

这是正确的数字求和,但有额外的 filter 方法,例如: .filter(index -> number.charAt(index) < 2) 我收到 Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 49

我将不胜感激关于如何修复上述两个解决方案的建议,并获得将 String 中的数字汇总到特定索引的功能方法。

String.charAt(int) returns 一个字符,然后将其框到 Character。此外,您可以使用 limit 而不是 filter。喜欢,

return IntStream.range(0, number.length())
        .limit(2)
        .map(i -> Character.digit(number.charAt(i), 10))
        .sum();

根据要求为 "153" 提供 6

你可以这样做:

number.chars()
      .limit(2)
      .map(Character::getNumericValue)
      .sum();

number.substring(0, 2)
            .chars()
            .map(Character::getNumericValue)
            .sum();