Почему java stream.count() возвращает long?

Почему stream.count() не возвращает int?

Я понимаю, что я легко могу преобразовать long в int путем кастинга

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

но почему будет java stream.count() возвращать long вместо int?

Ответ 1

Ну просто потому, что это самое большое 64-битное примитивное значение, которое имеет java. Другим способом будет два значения:

countLong/countInt

и это выглядело бы странно.

int подходит для long, но не наоборот. Все, что вы хотите сделать с помощью int, может вписаться в длинный, поэтому почему необходимо предоставить оба?

Ответ 2

Когда Java вышла в начале 1996 года, обычные ПК имели от 8 до 16 МБ памяти. Поскольку как массивы, так и коллекции были тесно связаны с размером памяти, использование int для представления подсчетов элементов казалось естественным, поскольку было достаточно обратиться к массиву int размером 4 ГБ - размер гигантский даже для жестких дисков в 1996 году, не говоря уже о RAM. Следовательно, использование long вместо int для размеров коллекции казалось бы расточительным в то время.

Хотя размер int может быть ограниченным фактором в разы, разработчики Java не могут изменить его на long, потому что это будет нарушение.

В отличие от коллекций Java потоки могут иметь потенциально неограниченное количество элементов, и они не содержат соображений совместимости. Поэтому использование long с его более широким диапазоном значений кажется очень разумным выбором.