Java 8 计算字符串的位数和时会出现奇怪的结果

Java 8 计算字符串的位数和时会出现奇怪的结果,java-8,java-stream,Java 8,Java Stream,此代码将字符串流化为字符值的IntStream,并将各个值相加: private static int getSumOfDigits(String line) { return line.chars().sum(); } 如果您输入23,您可能会得到5,但显然我得到101。这里出了什么问题?原因是,添加的不是数值,而是字符2和3的ascii值,即50和51 要获得真正的结果,可以使用java.lang.Character.getNumericValue将字符转换为期望的

此代码将字符串流化为字符值的IntStream,并将各个值相加:

private static int getSumOfDigits(String line) {
        return line.chars().sum();
    }

如果您输入23,您可能会得到5,但显然我得到101。这里出了什么问题?

原因是,添加的不是数值,而是字符
2
3
的ascii值,即
50
51


要获得真正的结果,可以使用
java.lang.Character.getNumericValue
将字符转换为期望的数字。

原因是,添加的不是数值,而是字符
2
3
的ascii值,即
50
51


要获得真正的结果,可以使用
java.lang.Character.getNumericValue
将字符转换为期望的数字。

@Martin Seeler是正确的。您需要将字符转换为整数:

return line.chars()
           .filter(Character::isDigit)
           .map(Character::getNumericValue)
           .sum();

@马丁·西勒是对的。您需要将字符转换为整数:

return line.chars()
           .filter(Character::isDigit)
           .map(Character::getNumericValue)
           .sum();

它不返回2+3,而是返回“2”和“3”的字符代码之和,即50+51。看见请注意,Java字符串也包含非ascii字符,因为它使用2个字节对字符进行编码。该死,我原以为前10个ascii是文字数字,但后来我回忆起前48个是特殊字符。Character.getNumericValue(char)在这里是将字符转换为int所必需的。如果您知道它们只是数字“0”-“9”,则可以安全地减去“0”以获得数值。e、 g.
'7'-'0'
是7。这是真的,但就像将空字符串连接到字符一样,我认为这种类型转换有点异味。这种转换没有异味,这是因为没有预测试。如果预先结束字符串格式的测试,则根据该格式执行操作没有任何错误,例如,
If(!line.matches([0-9]*”)抛出新的IllegalArgumentException();else返回line.chars().sum()-'0'*line.length()它不返回2+3,而是返回'2'和'3'的字符代码之和,即50+51。看见请注意,Java字符串也包含非ascii字符,因为它使用2个字节对字符进行编码。该死,我原以为前10个ascii是文字数字,但后来我回忆起前48个是特殊字符。Character.getNumericValue(char)在这里是将字符转换为int所必需的。如果您知道它们只是数字“0”-“9”,则可以安全地减去“0”以获得数值。e、 g.
'7'-'0'
是7。这是真的,但就像将空字符串连接到字符一样,我认为这种类型转换有点异味。这种转换没有异味,这是因为没有预测试。如果预先结束字符串格式的测试,则根据该格式执行操作没有任何错误,例如,
If(!line.matches([0-9]*”)抛出新的IllegalArgumentException();else返回line.chars().sum()-'0'*line.length()