Я уже понимаю, почему count () возвращает long, но почему sum () возвращает более узкий тип возврата, чем count ()?
sum()
возвращает сумму элементовв потоке, поэтому возвращаемый тип соответствует типу потока.LongStream.sum()
возвращает long
.
count()
не имеет прямого отношения к типу объектов, поступающих из потока, и соответствует остальным Stream
классам, которые они выбрали long
, тип, который представляет наибольший размер,Метод count()
фактически определяется на уровне интерфейса Stream
, который затем расширяется на BaseStream
, а затем на IntStream
, поэтому контракт сигнатуры метода должен быть сохранен.(В идеале count()
должен был бы вернуть unsigned
, но Java не поддерживает unsigned
.)
Как лучше всего добиться того, что я пытаюсь сделать в моих trailingZeroesметод?
Не ясно, чего вы пытаетесь достичь.Но я не вижу ничего особенно плохого в этом.
Если вы хотите, чтобы он возвратил int
, приведите значение перед возвратом.Я предполагаю, что вы знаете, что результат всегда будет безопасно помещаться в int
(результат всегда будет меньше, чем n
, что является int
), если вы не хотите изменить тип возвращаемого значения вашего метода на long
,
С другой стороны, не могу понять, что должен делать этот метод.Вы могли бы только что сделать:
public int trailingZeroes(int n) {
return n / 5;
}
Если вы ищете математический способ определить, сколько трейлингов 0
у вас есть в целом числе, оно будет другим.У вас уже есть предложенный ответ, поэтому я позволю себе предложить рекурсивное решение для удовольствия:
public int trailingZeroes(int n) {
return (n % 10 != 0)
? 0
: 1 + trailingZeroes(n / 10);
}