Java String.chars()-为什么;i-';0'&引用;这里用什么?

Java String.chars()-为什么;i-';0'&引用;这里用什么?,java,java-stream,Java,Java Stream,我解决了codewars上的任务,如下所示: 编写一个函数persistence,它接受一个正参数num 并返回其乘法持久性,即 您必须将num中的数字相乘,直到达到一个整数 数字 例如: 解决这个问题后,我找到了另一个解决方案: class Persist { public static int persistence(long n) { int times = 0; while (n >= 10) { n = Long

我解决了codewars上的任务,如下所示:

编写一个函数persistence,它接受一个正参数num 并返回其乘法持久性,即 您必须将num中的数字相乘,直到达到一个整数 数字

例如:

解决这个问题后,我找到了另一个解决方案:

  class Persist {
    public static int persistence(long n) {
        int times = 0;
        while (n >= 10) {
            n = Long.toString(n).chars().reduce(1, (r, i) -> r * (i - '0'));
            times++;
        }
        return times;
    }
 }

这是可行的,但为什么我们必须这样做:——“0”在reduce中?

i-“0”是将ASCII(或类似)数字的值转换为实际数字的常见方法。例如,
'5'
的编码实际上不是
5
,而是其他一些值(我认为是53或ASCII码)。但是在大多数系统中,
'5'
的编码比
'0'
的编码大5。因此,从字符“5”的编码中减去
'0'
(字符“0”的编码)的值将得到一个5的数值。

i-'0'
是将ASCII(或类似)数字的值转换为实际数字的常见方法。例如,
'5'
的编码实际上不是
5
,而是其他一些值(我认为是53或ASCII码)。但是在大多数系统中,
'5'
的编码比
'0'
的编码大5。因此,从字符“5”的编码中减去
'0'
(字符“0”的编码)的值将得到一个5的数值。

通常这是一种转换表示数字的
char
(或者像在你的例子中
int
,它包含码点)的方法(比如
char ch='3';
)进入
int
,其中将保存与该数字对应的数字(此处
int num=3;


类型为
char
的变量实际上并不包含字符的图形表示,但它包含对应于该字符在Unicode表中的位置/索引的数字。例如,将小写字母放在索引97处,即值
char ch='a'
将保存在其16个字节中(因为这是
char
type的大小)

由于
字符
包含一个数字
,我们可以使用对数字起作用的运算符,如
+
-
。这意味着我们可以编写像
'b'-'a'
这样的代码,它将作为
97-96
执行,结果是整数
1
。我们还可以使用
int-char
char-int
,因为这两种形式都将转换为
int-int
char
将转换为
int
),并返回
int
,它表示这些字符之间的距离

这就是
i-'0'
背后的主要思想。 我们知道在Unicode表中,数字被放置在某个地方(我们不知道确切的位置),以便。。。0 1 2 3 4 5 6 7 8 9 .... (它们之间没有字符)

这使我们确信

  • '9'-'9'
    将返回0
  • '9'-'8'
    将返回1
  • '9'-'7'
    将返回2
  • '9'-'0'
    将返回9
  • '8'-'0'
    将返回8
  • '7'-'0'
    将返回7
  • '1'-'0'
    将返回1
  • '0'-'0'
    将返回0
简言之,
indexOfNumberN-indexOfZero
为我们提供了
int
值为
NumberN


为了避免这种混乱的代码,您可以将lambda重写为更可读的形式


(r,i)->r*Character.getNumericValue(i)

通常,这是一种将表示数字(如
char ch='3';
)的
char
转换为
int
的方法,后者将保存与该数字对应的数字(此处
int num=3;


类型为
char
的变量实际上并不包含字符的图形表示,但它包含对应于该字符在Unicode表中的位置/索引的数字。例如,将小写字母放在索引97处,即值
char ch='a'
将保存在其16个字节中(因为这是
char
type的大小)

由于
字符
包含一个数字
,我们可以使用对数字起作用的运算符,如
+
-
。这意味着我们可以编写像
'b'-'a'
这样的代码,它将作为
97-96
执行,结果是整数
1
。我们还可以使用
int-char
char-int
,因为这两种形式都将转换为
int-int
char
将转换为
int
),并返回
int
,它表示这些字符之间的距离

这就是
i-'0'
背后的主要思想。 我们知道在Unicode表中,数字被放置在某个地方(我们不知道确切的位置),以便。。。0 1 2 3 4 5 6 7 8 9 .... (它们之间没有字符)

这使我们确信

  • '9'-'9'
    将返回0
  • '9'-'8'
    将返回1
  • '9'-'7'
    将返回2
  • '9'-'0'
    将返回9
  • '8'-'0'
    将返回8
  • '7'-'0'
    将返回7
  • '1'-'0'
    将返回1
  • '0'-'0'
    将返回0
简言之,
indexOfNumberN-indexOfZero
为我们提供了
int
值为
NumberN


为了避免这种混乱的代码,您可以将lambda重写为更可读的形式


(r,i)->r*字符。getNumericValue(i)

获取实际整数值。如果不是,则获得的ASCII等效值为
  class Persist {
    public static int persistence(long n) {
        int times = 0;
        while (n >= 10) {
            n = Long.toString(n).chars().reduce(1, (r, i) -> r * (i - '0'));
            times++;
        }
        return times;
    }
 }