为什么stream.count()
不返回int
?
我了解我可以通过强制转换轻松将long
转换为int
,
return (int) players.stream().filter(Player::isActive).count();
但为什么 java stream.count()
会返回long
而不是int
?
答案 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)));