我正在查看用于延迟流构建的 this 链接,并尝试将它用于我的一个案例。

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

在我的自定义逻辑中,我使用来自 Stream.iterator() 的 Iterator 进行流处理。

这在使用实际 Stream 时效果很好。但是,当我使用 Stream.flatMap() 构建惰性流时,当我开始迭代时会调用 onClose 函数,这反过来又给我带来了问题。

我在 zulu-opendjk 1.8.0_222 和 13 中尝试过这个。我在这两种环境中都遇到了这个异常。

java - java延迟流构建中的问题-LMLPHP

您可以使用以下代码重现该问题。

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 时;只应调用 closeStream.of(1) 方法。不是在 flatMap 函数中创建的流。

我期望 onClose 函数仅在流关闭时调用。但是,我不确定流在哪里关闭。

解决此案的任何帮助也将有所帮助。

最佳答案

当您在此处调用 flatMap(integer -> getStream()) 时:

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

您正在调用此方法:



因此,正如文档所说,您传递给此方法的映射流(来自 getStream() ,它是 MyIterator 上的流)将被关闭,然后(如该流的 onClose 中所定义)它调用 MyIterator.close() 抛出异常.

解决您的评论,因为你似乎并不遵循:
Stream<String> stream2 = Stream.of(1).flatMap(integer -> getStream());

创建一个流,当您阅读它时,该流将延迟映射到子流的内容。当该子流加载到主流时,子流将被关闭。
stream2.iterator().forEachRemaining(System.out::println);

您从映射到子流的主流读取,子流读取所有子流,然后关闭子流,然后调用 Stream.onClose() 调用 MyIterator.close()

关于java - java延迟流构建中的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58285575/

10-11 04:35
查看更多