为什么java stream.count()返回long?

时间:2017-06-20 19:01:20

标签: java java-8 java-stream

为什么stream.count()不返回int

我了解我可以通过强制转换轻松将long转换为int

return (int) players.stream().filter(Player::isActive).count();

为什么 java stream.count()会返回long而不是int

3 个答案:

答案 0 :(得分:21)

当Java于1996年初问世时,常见的PC有8到16 Mb的内存。由于数组和集合都与内存大小紧密相关,因此使用int表示元素计数似乎很自然,因为它足以处理大小为4Gb的int数组 - 规模巨大甚至对于1996年的硬盘驱动器,更不用说RAM了。因此,使用long代替int来收集尺寸在当时看起来很浪费。

尽管int大小有时可能是一个限制因素,但Java设计人员无法将其更改为long,因为这将是一个重大变化。

与Java集合不同,流可能具有可能无限数量的元素,并且它们没有兼容性考虑因素。因此,使用具有更宽范围值的long似乎是一个非常合理的选择。

答案 1 :(得分:18)

很简单,因为它是java拥有的最大的64位原始值。 另一种方式是两个计数:

countLong/countInt

这看起来很奇怪。

int适合long,但不是相反。你想用int做什么你可以长期适应,那么为什么需要同时提供?

答案 2 :(得分:11)

本声明

players.stream().filter(Player::isActive).count(); 

相当于:

players.stream().filter(Player::isActive).collect(Collectors.counting());

这仍然会返回long,因为Collectors.counting()已实现为

reducing(0L, e -> 1L, Long::sum)

返回int可以通过以下方式完成:

players.stream().filter(Player::isActive).collect(Collectors.reducing(0, e -> 1, Integer::sum));

此表单可用于groupingBy声明

Map<Player, Integer> playerCount = players.stream().filter(Player::isActive).collect(Collectors.groupingBy(Function.identity(), Collectors.reducing(0, e -> 1, Integer::sum)));