Преобразование среднего значения из лямбда-потока в целое число

У меня есть карта, и я хотел бы иметь целое число вместо двойного, но я не могу заставить его преобразовать. Моя проблема, похоже, заключается в части 'averagingInt'. Я получаю правильное значение, я просто хочу округлить его. Заранее спасибо.

public Map<String,Integer> executeSQL14(){
    return records.stream()
            .filter(p->p.getSource().equals("a") || p.getSource().equals("b"))
            .filter(p->p.getDestination().equals("f") || p.getDestination().equals("h"))
            .filter(p->p.getExtendedSecurityCheck().equals("n"))
            .collect(Collectors.groupingBy(Record::getDestination, Collectors.averagingInt(Record::getWeight)));
}

Если этот метод обрабатывает результаты SQL-запроса, возможно, вам следует выполнять всю фильтрацию и агрегирование непосредственно в SQL, а не в Java. Просто говорю.

Óscar López 03.02.2019 15:08

пожалуйста, поделитесь ожидаемым результатом

Ruslan 03.02.2019 15:09

В чем проблема? Record::getWeight возвращает double вместо int? Вы можете изменить его на Collectors.averagingInt(r -> (int) r.getWeight())

Eran 03.02.2019 15:10

@Eran getWeight() возвращает целое число, но метод averagingInt возвращает значение типа double. К сожалению, я не могу заставить его работать с вашим кодом. Тогда он не может разрешить метод getWeight.

GeneTrod 03.02.2019 15:13

@ ÓscarLópez Это упражнение для изучения лямбда-потоков, поэтому я стараюсь делать с ним все.

GeneTrod 03.02.2019 15:14

@Ruslan Я ожидаю строку типа «a» и значение типа «18», но вместо «18» я получаю что-то вроде «18.000802».

GeneTrod 03.02.2019 15:14
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
6
219
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Возможно, вы могли бы использовать альтернативный toMap как:

public Map<String,Integer> executeSQL14(List<Record> records) {
    return records.stream()
            .filter(p -> p.getSource().equals("a") || p.getSource().equals("b"))
            .filter(p -> p.getDestination().equals("f") || p.getDestination().equals("h"))
            .filter(p -> p.getExtendedSecurityCheck().equals("n"))
            .collect(Collectors.toMap(Record::getDestination, Record::getWeight, (a, b) -> (a + b) / 2));
}

или, возможно, выполнить дополнительную чистовую операцию, используя collectingAndThen как:

public Map<String,Integer> executeSQL14(List<Record> records) {
    return records.stream()
            .filter(p -> p.getSource().equals("a") || p.getSource().equals("b"))
            .filter(p -> p.getDestination().equals("f") || p.getDestination().equals("h"))
            .filter(p -> p.getExtendedSecurityCheck().equals("n"))
            .collect(Collectors.groupingBy(Record::getDestination, 
                    Collectors.collectingAndThen(Collectors.averagingInt(Record::getWeight), Double::intValue)));
}

Я пробовал оба решения, и второе решение моей проблемы. Большое спасибо!

GeneTrod 03.02.2019 15:27

Другие вопросы по теме