Jave collect()具有泛型类型的流

时间:2016-03-12 23:55:27

标签: java generics collections java-stream

来自collect()的{​​{1}}通用项目是否可以使用?

这就是我想要做的......

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; }

2 个答案:

答案 0 :(得分:2)

因此,如果代码的目的确实是根据类型参数过滤了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));
}

答案 1 :(得分:1)

所以问题是我使用原始类型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());
}