У меня есть карта, и я хотел бы иметь целое число вместо двойного, но я не могу заставить его преобразовать. Моя проблема, похоже, заключается в части '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)));
}
пожалуйста, поделитесь ожидаемым результатом
В чем проблема? Record::getWeight возвращает double вместо int? Вы можете изменить его на Collectors.averagingInt(r -> (int) r.getWeight())
@Eran getWeight() возвращает целое число, но метод averagingInt возвращает значение типа double. К сожалению, я не могу заставить его работать с вашим кодом. Тогда он не может разрешить метод getWeight.
@ ÓscarLópez Это упражнение для изучения лямбда-потоков, поэтому я стараюсь делать с ним все.
@Ruslan Я ожидаю строку типа «a» и значение типа «18», но вместо «18» я получаю что-то вроде «18.000802».




Возможно, вы могли бы использовать альтернативный 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)));
}
Я пробовал оба решения, и второе решение моей проблемы. Большое спасибо!
Если этот метод обрабатывает результаты SQL-запроса, возможно, вам следует выполнять всю фильтрацию и агрегирование непосредственно в SQL, а не в Java. Просто говорю.