Question Pourquoi java stream.count () retourne-t-il longtemps?


Pourquoi ne pas stream.count() retourner un int?

Je comprends que je peux facilement convertir le long à un int par coulée,

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

mais Pourquoi serait un java stream.count() retourner un long au lieu d'un int?


13
2018-06-20 19:01


origine


Réponses:


Eh bien tout simplement parce que java a la plus grande valeur primitive de 64 bits. L’autre serait deux compte:

countLong/countInt

et ça aurait l'air vraiment bizarre.

int rentre dans un long, mais pas l'inverse. Tout ce que vous voulez faire avec int peut tenir longtemps, alors pourquoi le besoin de fournir les deux?


14
2018-06-20 19:03



Lorsque Java est sorti au début de 1996, les PC ordinaires avaient 8 à 16 Mo de mémoire. Comme les tableaux et les collections étaient étroitement liés à la taille de la mémoire, en utilisant int représenter le nombre d’éléments semblait naturel, car il suffisait de ints qui est de 4 Go de taille - une taille gigantesque même pour les disques durs en 1996, sans parler de la mémoire vive. Par conséquent, en utilisant long au lieu de int pour les tailles de collection semblerait gaspiller à l'époque.

Bien que int taille peut être un facteur limitant parfois, les concepteurs Java ne peuvent pas le changer pour long, car ce serait un changement radical.

Contrairement aux collections Java, les flux peuvent contenir un nombre potentiellement illimité d'éléments et ne comportent aucune considération de compatibilité. Par conséquent, en utilisant long avec son éventail plus large de valeurs semble être un choix très raisonnable.


19
2018-06-20 19:20



Cette déclaration

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

est équivalent à:

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

Cela retourne toujours un long car Collectors.counting() est mis en œuvre comme

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

Retourner un int peut être accompli avec les éléments suivants:

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

Ce formulaire peut être utilisé dans groupingBy déclaration

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

0
2018-06-11 18:05