java lambda 循环整数_如何用Java 8流/lambda计算整数中的尾零数?

如果这是一个纯粹的假设性问题,下面是一个纯粹的假设性答案,说明您如何做到这一点:

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()

为了计算零的数目,最后你可以合并这两个

取而代之

S成一体。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值