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

NDa*_*vis 26 java java-8 java-stream

为什么不stream.count()退货int

我明白,我可以很容易地转换longint铸造,

return (int) players.stream().filter(Player::isActive).count();
Run Code Online (Sandbox Code Playgroud)

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

das*_*ght 22

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

虽然int大小有时可能是一个限制因素,但Java设计师无法将其更改为long,因为这将是一个突破性的变化.

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


Eug*_*ene 19

好吧,因为它是java拥有的最大的64位原始值.另一种方式是两个方面:

countLong/countInt
Run Code Online (Sandbox Code Playgroud)

这看起来很奇怪.

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

  • 如果我想节省内存怎么办?前任。计算长字符串中的字符数,知道每个字符出现的次数永远不会超过 Integer.MAX。在这种情况下使用 Long 而不是 Integer 会浪费内存。 (2认同)

小智 14

这个说法

players.stream().filter(Player::isActive).count(); 
Run Code Online (Sandbox Code Playgroud)

相当于:

players.stream().filter(Player::isActive).collect(Collectors.counting());
Run Code Online (Sandbox Code Playgroud)

这仍然返回一个long因为Collectors.counting()实现为

reducing(0L, e -> 1L, Long::sum)
Run Code Online (Sandbox Code Playgroud)

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

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

此表单可用于groupingBy声明

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