簡體   English   中英

java 懶惰 stream 構造中的問題

[英]Issue in java lazy stream construction

我正在查看鏈接以了解惰性 stream 構造,並嘗試將其用於我的一個案例。

我的主要 stream 有一些需要在Stream.onClose()上完成的操作。

在我的自定義邏輯中,我使用來自Stream.iterator()的迭代器進行 stream 處理。

這很好地消耗了實際的 Stream。 但是,當我使用Stream.flatMap()來構造一個惰性 stream 時, onClose function 在我開始迭代時被調用,這反過來又給我帶來了問題。

我在 zulu-opendjk 1.8.0_222 和 13 中嘗試過這個。我在兩種環境中都面臨這個異常。

在此處輸入圖像描述

您可以使用以下代碼重現該問題。

import java.util.*;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

public class TestStreamIterator
{
    public static void main(String args[])
    {
        Stream<String> stream1 = getStream();
        stream1.iterator().forEachRemaining(System.out::println);

        Stream<String> stream2 = Stream.of(1).flatMap(integer -> getStream());
        stream2.iterator().forEachRemaining(System.out::println);
    }

    private static Stream<String> getStream()
    {
        List<String> values = Arrays.asList("a", "b", "c");

        MyIterator iterator = new MyIterator(values);
        Stream<String> stream = StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.NONNULL | Spliterator.IMMUTABLE), false).onClose(iterator::close);

        return stream;
    }

    private static class MyIterator implements Iterator<String>, AutoCloseable
    {
        private Iterator<String> iterator;

        public MyIterator(List<String> values)
        {
            iterator = values.iterator();
        }

        @Override
        public boolean hasNext()
        {
            return iterator.hasNext();
        }

        @Override
        public String next()
        {
            return iterator.next();
        }

        @Override
        public void close()
        {
            throw new IllegalStateException("Should not come here");
        }
    }
}

我的低估是,使用flatMap時; 只應調用Stream.of(1)close方法。 不是在flatMap function 中創建的 stream。

我期待onClose function 只有在 stream 關閉時才會被調用。 但是,我不確定 stream 在哪里關閉。

解決此案的任何幫助也會有所幫助。

當您在這里調用flatMap(integer -> getStream())時:

Stream<String> stream2 = Stream.of(1).flatMap(integer -> getStream());
stream2.iterator().forEachRemaining(System.out::println);

您正在調用此方法:

迭代器

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);

Returns a stream consisting of the results of replacing each element of this stream with the contents of a mapped stream produced by applying the provided mapping function to each element. 每個映射的 stream 在其內容已放入此 stream 后關閉 (如果映射的 stream 是 null 則使用空的 stream。)

因此,正如文檔所述,映射的 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ 您傳遞給此方法(來自getStream() ,它是 MyIterator 上的MyIterator )將被關閉,它就是這樣,然后(如該 Stream 的onClose中定義)它調用MyIterator.close()引發異常。


解決您的評論,因為您似乎沒有關注:

Stream<String> stream2 = Stream.of(1).flatMap(integer -> getStream());

創建一個 stream ,當您閱讀它時,它將延遲 map 到子流的內容。 當該子流加載到主 stream 時,子流將被關閉。

stream2.iterator().forEachRemaining(System.out::println);

您從主 stream 讀取,它映射到子流,讀取所有子流然后關閉子流,然后調用Stream.onClose()調用MyIterator.close()

暫無
暫無

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

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