Если это чисто гипотетический вопрос, вот чисто гипотетический ответ о том, как вы можете это сделать:
static int countZeroes(int value) {
if(value == 0) // we need to handle this case explicitly
return 1;
IntStream s = IntStream.iterate(value, v -> v / 10);
return (int) takeWhile(s, v -> v > 0 && v % 10 == 0)
.count();
}
Он использует вспомогательную функцию takeWhile
, которая доступна в Java 9, но не вJava 8 так должна эмулироваться следующим образом:
// In Java 9 there is a standard takeWhile
// https://docs.oracle.com/javase/9/docs/api/java/util/stream/Stream.html#takeWhile-java.util.function.Predicate-
// but in Java 8 I have to emulate it
static IntStream takeWhile(IntStream s, final IntPredicate pr) {
final Spliterator.OfInt origSp = s.spliterator();
Spliterator.OfInt filtered = new Spliterators.AbstractIntSpliterator(origSp.estimateSize(), 0) {
boolean lastPredicate = true;
@Override
public boolean tryAdvance(final IntConsumer action) {
if (!lastPredicate)
return false;
origSp.tryAdvance((int v) -> {
lastPredicate = pr.test(v);
if (lastPredicate) {
action.accept(v);
}
});
return lastPredicate;
}
};
return StreamSupport.intStream(filtered, false);
}
Идея состоит в том, что
IntStream.iterate(value, v1 -> v1 / 10).takeWhile(v -> v > 0)
должен генерировать поток цифр вырезывания в конце один за другим, а затем вы можете применитьtakeWhile(v -> v % 10 == 0).count()
для подсчета количества нулей и, наконец, вы можете объединить эти два takeWhile
в один.