我最近开始使用Java流。我试图从我的一个SQL查询的结果集中获取String值。结果集仅从数据库中选择一个String / Varchar列。
我做到了:
List<String> list = query.getResultList().stream().map(Object::toString).collect(Collectors.toList());
或:
List<String> list = = query.getResultList().stream().map(String::valueOf).collect(Collectors.toList());
我认为地图具有将数据从一种类型转换为另一种类型的功能。在这种情况下,从Object到String,然后将它们收集在String列表中。
但是上面的代码显示了编译时错误:无法从Object转换为字符串列表。
请向我建议正确的做法,并解释我的理解出了什么问题。
答案 0 :(得分:3)
由于Query.getResultList()
返回一个raw type List
,因此它将中断很大程度上基于泛型类型信息的流管道。原始类型有效地删除了有关泛型类型的所有信息,因此流收集器返回Object
。
您可以通过手动将泛型类型强制转换为List<?>
来解决此问题:
List<String> collect = ((List<?>) query.getResultList()).stream()
.map(Object::toString)
.collect(Collectors.toList());
答案 1 :(得分:3)
使用TypedQuery<String>
代替Query
。
这消除了多余的重映射,并引入了类型安全性。