NDa*_*vis 26 java java-8 java-stream
为什么不stream.count()退货int?
我明白,我可以很容易地转换long成int铸造,
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做什么你可以长期适应,那么为什么需要同时提供?
小智 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)