簡體   English   中英

具有通用類型的Java collect()流

[英]Java collect() Stream with generic type

有沒有辦法從stream collect()通用項目?

這就是我想做的...

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;

}

這行不通,我明白了

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

因此,問題是我使用原始類型List<Response> responses作為參數,盡管我確實應該使用通配符邊界List<Response<? extends Data>> 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());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM