我试图更多地使用Java 8 beautiful&& amp;精彩的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));
}
或者不可能?来自委内瑞拉的最好的问候任何帮助都非常感谢。
答案 0 :(得分:1)
如果Criteria.list()
的返回类型被声明为没有类型的原始类型List
,那么你知道Hibernate返回的集合的类型没有帮助参数,编译器不知道。
无论您使用哪种方法,都至少涉及一次未经检查的操作。
您最好的变体是将List
分配给List<Student>
的变体,因为未经检查的操作发生在API强制您到达的位置通过将Criteria.list()
的结果从List
转换为List<Student>
来执行此操作。然后,所有后续操作都可以执行类型安全(假设您的列表包含Student
实例的断言是正确的。)
请注意,这与类型擦除无关,只是原始类型使用。没有要删除的类型信息,因为Criterion
类首先没有通用类型信息。