Java 8 Hibernate Streams Критерии группировки По типу стирания?
Я пытаюсь привлечь больше с Java 8 красивый && прекрасный API.
Вот мой код
private final Map<String,List<Student>>getStudentsAsStreamAndCollect()
{
final Criteria criteria = currentSession().createCriteria(Student.class)
.setMaxResults(10);
return (Map<String,List<Student>>)criteria.list()
.stream()
.collect(Collectors.groupingBy(Student::getSingle));
}
Это прекрасно работает, я хотел бы сделать что-то вроде этого..`
private final Map<String,List<Student>>getStudentsAsStreamAndCollect()
{
return currentSession().createCriteria(Student.class)
.setMaxResults(10)
.list()
.stream()
.collect(Collectors.groupingBy(Student::getSingle));
}
Но возникает ошибка компиляции
incompatibles types Object cannot be cast to Map<String,List<Student>>
Я знаю, что это связано с типом стирания при компиляции, пожалуйста, исправьте меня на этом этапе....
Это похоже на работу
private final Map<String,List<Student>>getStudentsAsStreamAndCollect()
{
final List<Student> students = currentSession().createCriteria(Student.class)
.setMaxResults(10);
.list();
students.stream()
.collect(Collectors.groupingBy(Student::getSingle));
}
У меня вопрос: знаю ли я тип коллекции, возвращенной Hibernate?
currentSession().createCriteria(Student.class)
Есть некоторый подход, чтобы быть в состоянии сделать
private final Map<String,List<Student>>getStudentsAsStreamAndCollect()
{
return currentSession().createCriteria(Student.class)
.setMaxResults(10);
.list()
.stream()
.collect(Collectors.groupingBy(Student::getSingle));
}
Или это невозможно? С наилучшими пожеланиями из Венесуэлы, любая помощь очень ценится.
1 ответ
Это не помогает, что вы знаете тип коллекции, возвращаемой Hibernate, если тип возвращаемого значения Criteria.list()
объявлен как необработанный тип List
без аргумента типа компилятор не знает.
Независимо от того, какой подход вы используете, он включает по крайней мере одну непроверенную операцию.
Лучший из ваших вариантов это тот, где вы назначаете List
в List<Student>
как здесь, непроверенная операция происходит прямо в точке, где API вынуждает вас сделать это, передавая результат Criteria.list()
от List
в List<Student>
, Затем все последующие действия могут быть выполнены в безопасном режиме (при условии, что ваше утверждение о том, что список содержит Student
экземпляр правильный).
Обратите внимание, что это не имеет ничего общего с стиранием типов, это просто использование необработанных типов. Нет информации о типе, которую нужно стереть Criterion
Во-первых, у класса не было информации об общем типе.