如何应用流减少(计数)到IntStream并更改返回类型为“int”

问题描述 投票:3回答:4

此代码不会编译:

public int trailingZeroes(int n) {
    return IntStream.rangeClosed(1,n)
            .filter(e -> (e  % 5) == 0)
            .count();
}

我注意到在返回类型的IntStream方法有区别的:

int sum() VS long count()

当试图从计数操作返回int类型上面,

  • 我已经明白,为什么count()返回长,但为什么比sum() count()返回一个较窄的返回类型?
  • 什么是实现我尝试在做的最好的办法我 trailingZeroes方法?
java java-stream reduction
4个回答
3
投票

因为两个整数的总和是一个int sum方法返回int

对于count的Javadoc说,这是相当于mapToLong(e -> 1L).sum()。你可以用它来使自己的计数返回一个int,就像这样:

return IntStream.rangeClosed(1,n)
        .filter(e -> (e  % 5) == 0)
        .map(e -> 1)
        .sum();

或者,因为你根本不知道你的回答将适合在int反正,只投它:

return (int) IntStream.rangeClosed(1,n)
        .filter(e -> (e  % 5) == 0)
        .count();

2
投票

我已经明白,为什么数()返回一个长,但为什么总和()返回一个更窄的返回类型比count()?

sum()返回流中的项目的总和,所以返回的类型流的类型相匹配。 LongStream.sum()返回long

count()没有直接关系,从流来的对象的类型,并与他们选择的Streamlong的其余部分,表示最大尺寸的类型一致。该count()方法是在Stream界面水平,然后将其通过BaseStream扩展实际上被定义,并随后通过IntStream,因此该方法的签名的合同必须被保留。 (理想情况下count()应返回unsigned,但Java不支持unsigned。)

什么是达到我想要在我的trailingZeroes方法做了最好的方法是什么?

尚不清楚你想要达到的目的。但我看没有什么特别的毛病。

如果你希望它返回int,返回之前投的价值。我想你知道,结果始终符合安全地在int(结果将永远是小于n这是一个int),除非你想改变你的方法long的返回类型。

在另一方面不明白这是什么方法应该做的事情。你可能只是做:

public int trailingZeroes(int n) {
  return n / 5;
}

如果你正在寻找一种数学方法来确定有多少尾随0s有一个整数,这将是不同的。你已经有一个建议的答案,所以服用冒昧地建议为它的乐趣递归的解决方案:

public int trailingZeroes(int n) {
   return (n % 10 != 0) 
        ? 0 
        : 1 + trailingZeroes(n / 10);
}

2
投票

COUNT()返回一个长,但为什么有总和()返回一个更窄的返回类型比count()?

从的Javadoc,IntStream.count恰好是减少的特殊情况

return mapToLong(e -> 1L).sum();

这就是为什么它返回一个long。另外IntStream.sum又是内部使用Integer.sum特别降价

return reduce(0, Integer::sum) // signature of sum being 'int sum(int a, int b)'

这就是为什么它返回一个int

什么是达到我想要在我的trailingZeroes方法做了最好的方法是什么?

相对于其他的解决方案有轻微的优化,你可以只map的使用方法:

public int trailingZeroes(int n) {
    return IntStream.rangeClosed(1, n)
        .map(e -> (e % 5) == 0 ? 1 : 0)
        .sum();
}

从方法的名字,你应该寻找在你的执行应推断:

public int trailingZeroes(int n) {
    int count = 0;
    while (n % 10 == 0) {
        count++;
        n = n / 10;
    }
    return count;
}

其中,当在Java的语法9代表应是这样的:

public int trailingZeroes(int n) {
    return (int) IntStream.iterate(n, i -> i % 10 == 0, i -> i / 10).count();
}

1
投票

sum()返回元素的总和在此流因为你使用IntStreamsum()均返回int类型。注:sum()方法LongStream将返回long类型。

要获得int你可以使用铸造:

return (int)IntStream.rangeClosed(1,n)
            .filter(e -> (e  % 5) == 0)
            .count();
© www.soinside.com 2019 - 2024. All rights reserved.