为什么将变量声明为int类型需要转换流?long类型不需要强制转换

aar*_*van 1 java java-stream

为什么一个原始类型需要铸造而另一个不需要铸造?

/* This method uses stream operations to count how many numbers in a given array
* of integers are negative
*/    

public static void countNegatives(int[] nums) {
    long howMany = stream(nums) // or: int howMany = (int) stream(nums)
            .filter(n -> n < 0)
            .count();
    System.out.print(howMany);
}
Run Code Online (Sandbox Code Playgroud)

mat*_*sev 6

count()Java IntStream类的方法已定义为返回long值.从文档:

long count()返回此流中元素的数量.这是减少的特殊情况,相当于:

 return mapToLong(e -> 1L).sum();
Run Code Online (Sandbox Code Playgroud)

换句话说,这就是Java的设计方式,即它与Lambda没什么关系.


Ous*_* D. 6

count()返回long而不是每个都long可以适合,int因此需要显式转换将结果存储到int.这与java-10无关.它一直存在于以前的JDK中.

如果你不想投,那么替代方案将是:

...
.filter(n -> n < 0)
.map(e -> 1)
.sum();
Run Code Online (Sandbox Code Playgroud)

但是正如人们可以看到这不像你的例子那样可读,因为代码本质上是说"给我一个通过过滤操作的元素的总和 ",而不是"给我一个通过过滤操作的元素的计数 ".

因此,最终如果您需要将结果作为int,那么请选择演员.

  • `stream(nums)`已经是`IntStream`.@Bobulous (3认同)