Java 8 Hibernate流标准按擦除类型分组?
我一直在尝试更多地使用Java8漂亮和美妙的API 这是我的密码Java 8 Hibernate流标准按擦除类型分组?,java,hibernate,java-8,java-stream,type-erasure,Java,Hibernate,Java 8,Java Stream,Type Erasure,我一直在尝试更多地使用Java8漂亮和美妙的API 这是我的密码 private final Map<String,List<Student>>getStudentsAsStreamAndCollect() { final Criteria criteria = currentSession().createCriteria(Student.class) .setMaxResults(10); return (Map<Str
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));
}
私有最终映射GetStudentsStreamandCollect()
{
return currentSession().createCriteria(Student.class)
.setMaxResults(10);
.list()
.stream()
.collect(Collectors.groupingBy(Student::getSingle));
}
还是不可能 知道Hibernate返回的集合类型没有帮助,如果Criteria.list()
的返回类型被声明为原始类型list
,没有类型参数,编译器不知道
无论使用哪种方法,它都至少涉及一个未检查的操作
最好的变体是将列表
分配给列表
,因为在这里,未检查的操作正好发生在API强制您执行操作的点上,方法是将Criteria.List()的结果从列表
转换为列表
。然后,可以执行类型安全的所有后续操作(假设您关于列表包含Student
实例的断言是正确的)
请注意,这与类型擦除无关,只是关于原始类型的使用。由于标准
类一开始没有泛型类型信息,因此没有可擦除的类型信息。非常好地回答了criteria.list()怎么可能是标准;签名应该像是不是原始类型和类型参数只是为我的知识一样。createCriteria(类类型)、List或其他非常感谢的东西。如果Criteria
是一个泛型类,则可以通过返回其List()
方法的适当类型实例的方式声明createCriteria
。然后,它工作顺利。请注意,您还可以通过强制转换每个元素来修复它:criteria.list().stream().map(Student.class::cast)代码>
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));
}
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));
}