簡體   English   中英

將迭代器轉換為列表會導致空列表

[英]Converting an iterator to a list results in an empty list

我有相當於,從這里

Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();
sourceIterator.forEachRemaining(source -> System.out.println(source)); // prints out all elements
Iterable<String> iterable = () -> sourceIterator;
List<String> targetList = StreamSupport.stream(iterable.spliterator(), false).
    .collect(Collectors.toList());
System.out.println(targetList.isEmpty()) // prints true

在我想出進行轉換的方法之前,我已經添加了一些調試打印語句來幫助我。 但事實證明,stream 是空的。 所以我想知道我的內容或我的方法是否不太正確?

閱讀forEachRemaining它說:

對每個剩余元素執行給定的操作,直到所有元素都已處理或該操作引發異常。 如果指定了迭代順序,則按迭代順序執行操作。 操作引發的異常將轉發給調用者。

它看起來並沒有從迭代器中刪除任何東西,所以我不認為是這樣。

使用代碼,看起來forEachRemaining確實清空了 stream。 沒有那條線,stream 最終不會是空的。 問題中iterator的鏈接解釋給出了這個默認實現:

while (hasNext())
    action.accept(next());

這將清空迭代器。 這與以下拆分器不同:

調用 tryAdvance(java.util.function.Consumer<? super T>)

不是next() ,但無論如何,您不能迭代兩次。

暫無
暫無

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

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