簡體   English   中英

Java:如何將集合傳遞給chainedIterator(集合<iterator<? extends e> &gt; 迭代器)來自 Apache commons collection4 lib? </iterator<?>

[英]Java : How to pass collection to chainedIterator(Collection<Iterator<? extends E>> iterators) from Apache commons collection4 lib?

我在下面的代碼中嘗試使用來自org.apache.commons.collections4.IteratorUtils (Apache commons collection4 lib) 的chainedIterator(Collection<Iterator<? extends E>> iterators) ) 但給出編譯時錯誤。

這是我的代碼..

private Iterator<Resource> getResources() {
        String[] paths = getParameterValues();
        Collection<Iterator<Resource>> its = new ArrayList<Iterator<Resource>>();       
        for (int i = 0; i < paths.length; i++) {
            String path = paths[i];         
            its.add(getOnlyResource(path));
        }
        return IteratorUtils.chainedIterator(its); //gives compile error - The method chainedIterator(Iterator<? extends E>...) in the type IteratorUtils is not applicable for the arguments (Collection<Iterator<Resource>>)
    }

問題是方法簽名

public static <E> Iterator<E>
    chainedIterator(Collection<Iterator<? extends E>> iterators)

這太嚴格了。

它說要返回一個Iterator<Resource>你必須傳入一個Collection<Iterator<? extends Resource>> Collection<Iterator<? extends Resource>>

反映實際意圖的方法簽名必須是

public static <E> Iterator<E>
    chainedIterator(Collection<? extends Iterator<? extends E>> iterators)

然后,您的代碼將無錯誤地編譯,並且可以證明使用該寬松簽名實現該方法是可能的,例如

public static <E> Iterator<E>
    chainedIterator(Collection<? extends Iterator<? extends E>> iterators) {

    if(iterators.isEmpty()) return Collections.emptyIterator();
    return iterators.stream()
        .flatMap(it -> StreamSupport.stream(
            Spliterators.<E>spliteratorUnknownSize(it, Spliterator.ORDERED), false))
        .iterator();
}

另請參閱如何將迭代器轉換為 stream?


但是您可以通過准確提供當前方法簽名的要求來解決當前方法簽名的問題。 只需更改聲明

Collection<Iterator<Resource>> its = new ArrayList<Iterator<Resource>>();

Collection<Iterator<? extends Resource>> its = new ArrayList<>();

然后,您可以按原樣使用IteratorUtils 但請注意,您根本不需要 3rd 方庫。 整個方法只能使用內置功能來實現,例如

private Iterator<Resource> getResources() {
    return Arrays.stream(getParameterValues())
        .map(path -> getOnlyResource(path))
        .flatMap(it -> StreamSupport.stream(
            Spliterators.spliteratorUnknownSize(it, Spliterator.ORDERED), false))
        .iterator();
}

這類似於上面的示例chainedIterator實現,但不需要首先將迭代器收集到集合中的步驟。 相反,它是惰性的,所以如果調用者沒有遍歷所有元素,這個解決方案甚至可能會跳過不必要getOnlyResource調用。

暫無
暫無

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

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