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

时间:2018-10-13 19:47:00

标签: 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);
}

2 个答案:

答案 0 :(得分:6)

Java IntStream类的count()方法已定义为返回long值。来自documentation

  

长期计数()   返回此流中的元素计数。这是减少的一种特殊情况,等效于:

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

换句话说,这就是Java的设计方式,即它与Lambda无关。

答案 1 :(得分:6)

count()返回long,但并非每个long都可以放入int 中,因此 explicit 强制转换为需要将结果存储到int中。这与java-10无关。在以前的JDK中一直存在。

如果您不想投射,则可以选择:

...
.filter(n -> n < 0)
.map(e -> 1)
.sum();

但正如人们所看到的那样,这并不像您的示例那样可读,因为代码本质上是说“给通过过滤操作的元素求和”而不是“给我 >计数通过过滤操作的元素”。

因此,最终,如果您需要将结果作为 int 来进行转换。