Tôi đang tìm kiếm một cách ngắn gọn để chuyển đổi Iterator
một Stream
hoặc cụ thể hơn để "xem" trình vòng lặp dưới dạng luồng.
Vì lý do hiệu suất, tôi muốn tránh một bản sao của trình lặp trong danh sách mới:
Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();
Collection<String> copyList = new ArrayList<String>();
sourceIterator.forEachRemaining(copyList::add);
Stream<String> targetStream = copyList.stream();
Dựa trên một số gợi ý trong các bình luận, tôi cũng đã thử sử dụng Stream.generate
:
public static void main(String[] args) throws Exception {
Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();
Stream<String> targetStream = Stream.generate(sourceIterator::next);
targetStream.forEach(System.out::println);
}
Tuy nhiên, tôi nhận được một NoSuchElementException
(vì không có lời mời hasNext
)
Exception in thread "main" java.util.NoSuchElementException
at java.util.AbstractList$Itr.next(AbstractList.java:364)
at Main$$Lambda$1/1175962212.get(Unknown Source)
at java.util.stream.StreamSpliterators$InfiniteSupplyingSpliterator$OfRef.tryAdvance(StreamSpliterators.java:1351)
at java.util.Spliterator.forEachRemaining(Spliterator.java:326)
at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
at Main.main(Main.java:20)
Tôi đã xem StreamSupport
và Collections
tôi không tìm thấy gì cả.
Stream.generate(iterator::next)
hoạt động?