Nat*_*ati 1 java generics collections java-stream
有没有办法collect()从 a获取通用项目stream?
这就是我想做的...
private <T extends Data> List<Response<T>> validateAndGetResponses(List<Response> responses, Class<T> clazz) {
Supplier<List<Response<T>>> supplier = LinkedList::new;
List<Response<T>> list = responses.stream().filter(
response -> clazz.isInstance(getData(response))).collect(Collectors.toCollection(supplier));
return list;
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,我明白了
no suitable method found for collect(....)
因此,如果代码的目的确实是根据类型参数过滤 Response 对象,那么对解决方案的猜测可能是:
@SuppressWarnings("unchecked")
private <T extends Data> List<Response<T>> validateAndGetResponses(List<Response<? extends Data>> responses, Class<T> clazz) {
return responses.stream()
.filter(response -> clazz.isInstance(getData(response)))
.map(response -> (Response<T>) response)
.collect(Collectors.toCollection(LinkedList::new));
}
Run Code Online (Sandbox Code Playgroud)
所以问题是我使用原始类型List<Response> responses作为参数,尽管我确实应该使用通配符边界List<Response<? extends Data>> responses.
这是完整的方法:
@SuppressWarnings("unchecked")
private <T extends Data> List<T> validateAndGetResponses(List<Response<? extends Data>> responses, Class<T> clazz) {
return responses.stream().map(this::getData)
.filter(clazz::isInstance)
.map(r -> (T) r)
.collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5801 次 |
| 最近记录: |