Коллектор усреднения не должен хранить все числа, которые он усредняет, в памяти: все, что ему нужно для отслеживания, - это сумма и количество элементов, которые затем делятся в конце, чтобы получить среднее значение.
Таким образом, не имеет значения, сколько вещей читается из файла: пространство, используемое для вычисления среднего, является постоянным.
В есть бит Java 3-е издание, на стр. 214, где говорится, что вы должны использовать только определенные коллекторы в качестве нижестоящих коллекторов - Collectors.averagingInt
является одним из таких коллекторов. Вам не нужно использовать эти коллекторы как «первичные» (если это правильный термин) коллекторы, потому что те же функции доступны непосредственно в API потока.
Более правильный способ - использовать IntStream
, который имеет average()
метод:
return Files.readAllLines(Paths.get(fileName)).stream()
.flatMap(n -> Arrays.stream(n.split(" ")))
.mapToInt(Integer::parseInt)
.average() // Returns an OptionalDouble
.orElse(0); // averagingInt returns 0 if the stream is empty.