Почему они используют .chars ()?
Поскольку вам нужно получить доступ к каждому символу, если вы хотите вручную преобразовать String в int. Каждый символ содержит одну цифру номера, поэтому вам нужно получить доступ к каждому символу. String.chars()
возвращает поток символов в String.
В третьей и последней строке я даже не понимаю синтаксис.
Давайте сломаем его, затем:
Stream.reduce()
уменьшает значения внутри потока до одного единственного значения, используя 0
в качестве значения identity и лямбда-выражения (runningSum,c) -> runningSum * 10 + c -'0'
в качестве аккумулятора .
Лямбда-выражение (runningSum,c) -> runningSum * 10 + c -'0'
преобразуется в экземпляр BinaryOperator
компилятором Java. Этот конкретный экземпляр принимает два аргумента int и возвращает один результат int. Вы можете себе представить, что это выглядит примерно так:
class CompilerGeneratedBinaryOperator implements BinaryOperator {
public int apply(int runningSum, int c) {
return runningSum * 10 + c -'0';
}
}
Метод уменьшить затем вызовет этот метод в цикле по всем символам в String, всегда используя последний результат как следующий параметр runningSum
(и идентификатор 0
в самом первом вызове).
Теперь давайте посмотрим на инструкцию внутри лямбда: runningSum * 10 + c -'0'
.
Что здесь происходит, он использует код ASCII для каждого символа. Он в основном предполагает, что он имеет строку, которая представляет действительное целое число, то есть все символы находятся в пределах от '0'
до '9'
. Если вы посмотрите таблицу ASCII, вы заметите, что целочисленное представление числовых символов - 48
- 57
. Таким образом, '0'
равен 48
, что означает, что, когда символ c
равен '0'
, это значение равно 48
, а c - '0'
будет 48 - 48
, что 0
. Если c
- '1'
, '1' - '0'
будет 1
и так далее. В основном c - '0'
дает целочисленное значение, соответствующее значению, представленному символом.
Остальное просто. Он умножит каждый последний результат на 10
и добавит текущую цифру, как указано в . Ответ Майкла работает следующим образом:
Step 1. 0
Step 2. (0 * 10) + 1 == 1
Step 3. (1 * 10) + 2 == 12
Step 4. (12 * 10) + 3 == 123