为什么stream.count()
不会返回一个int
?
我知道我可以通过强制类型转换轻松将long
转换为int
,
return (int) players.stream().filter(Player::isActive).count();
但是为什么Java中的stream.count()
会返回一个long
而不是一个int
呢?
为什么stream.count()
不会返回一个int
?
我知道我可以通过强制类型转换轻松将long
转换为int
,
return (int) players.stream().filter(Player::isActive).count();
但是为什么Java中的stream.count()
会返回一个long
而不是一个int
呢?
这个声明
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)));
它是Java支持的最大的64位原始值,所以就选用了它。
另一种方法将涉及两个计数:
countLong/countInt
那看起来会非常奇怪。
int
可以放在 long
里,但反过来就不行。你想用 int
做什么,都可以放在 long
里面,所以为什么需要提供两个呢?