[英]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.