Реализовать метод для вычисления средней зарплаты сотрудников с зарплатой выше заданного лимита с использованием стримов
Что проверяют
Знаете ли вы примитивные специализации стримов и то, как они возвращают результат для пустого набора. Задача на пять строк, но по ней видно, думаете ли вы про граничные случаи и чем вообще считать деньги.
Как отвечать
Фильтр, затем mapToDouble и average, которая возвращает OptionalDouble именно потому, что среднего у пустого набора не существует:
record Employee(String name, BigDecimal salary) {}
static OptionalDouble averageAbove(List<Employee> staff, BigDecimal limit) {
return staff.stream()
.map(Employee::salary)
.filter(s -> s.compareTo(limit) > 0)
.mapToDouble(BigDecimal::doubleValue)
.average();
}Объясните решение вслух. Optional в сигнатуре оставлен намеренно, чтобы вызывающий код сам решил, что значит «подходящих сотрудников нет». Подменять пустоту нулём внутри метода нельзя: ноль это валидное среднее значение, и снаружи два случая станет не отличить.
Второй момент, который ценят: зарплату не хранят в double. Для денег берут BigDecimal или целое число минимальных единиц, а сравнивают через compareTo, потому что equals у BigDecimal учитывает масштаб и считает разными числа с разным количеством нулей после запятой.
Если попросят вернуть ещё и количество, покажите summaryStatistics, а для разбивки по отделам groupingBy с averagingDouble в роли нижестоящего сборщика.
Где спотыкаются
Считают среднее вручную: копят сумму во внешней переменной внутри forEach и делят на размер исходного списка. Это и мутация внешнего состояния, запрещённая контрактом стрима, и деление на ноль, когда фильтр не пропустил никого.
Второе: фильтруют по нестрогому сравнению там, где просили «выше лимита». Формулировку стоит переспросить вслух: включать границу или нет, это единственное настоящее требование в задаче, и уточняющий вопрос здесь ждут.
Третье: добавляют parallelStream без повода. На списке в несколько тысяч элементов выигрыш отрицательный, разбиение и общий пул потоков обходятся дороже самого вычисления, а объяснить этот выбор кандидат обычно не может.