java - java惰性流构造中的问题
问题描述
我正在查看此链接以进行惰性流构造,并尝试将其用于我的一个案例。
我的主流有一些需要在Stream.onClose()上完成的操作。
在我的自定义逻辑中,我使用Stream.iterator()中的 Iterator进行流处理。
这很好地消耗了实际的流。但是,当我使用Stream.flatMap()构建惰性流时,onClose
当我开始迭代时会调用函数,这反过来又给我带来了问题。
我在 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
; close
方法Stream.of(1)
only 应该被调用。不是在flatMap
函数内部创建的流。
我期望onClose
仅在流关闭时调用该函数。但是,我不确定流在哪里关闭。
解决此案的任何帮助也会有所帮助。
解决方案
当你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);
返回一个流,其中包含将此流的每个元素替换为通过将提供的映射函数应用于每个元素而生成的映射流的内容的结果。每个映射流在其内容被放入该流后关闭。(如果映射流为空,则使用空流。)
因此,正如文档所述,您传递给此方法的映射流(从中getStream()
是 Stream 上的 a MyIterator
)将被关闭,然后(如onClose
该 Stream 中定义的那样)它调用MyIterator.close()
抛出异常。
解决您的评论,因为您似乎没有关注:
Stream<String> stream2 = Stream.of(1).flatMap(integer -> getStream());
创建一个流,当您读取它时,该流将延迟映射到子流的内容。当该子流加载到主流中时,子流将被关闭。
stream2.iterator().forEachRemaining(System.out::println);
您从主流中读取,它映射到子流,读取所有子流然后关闭子流,然后调用Stream.onClose()
which 调用MyIterator.close()
推荐阅读
- mysql - MySQL Count cols 与多个 group by
- javascript - 切换图标更改
- list - 使用 () 参数调用的未定义函数
- c++ - Nanomsg 具有多线程应用程序的非阻塞双向套接字
- javascript - Node.js 对输入文件的每一行进行请求并将响应写入输出文件
- java - kotlin 中的以下代码相当于什么?
- c++ - 嵌套类成员变量不可访问。链表设置。v、next 和 new 的问题
- python-3.x - opencv:无法在 pythonanywhere 中读取 facerecognizer 模型
- python - 我正在尝试搜索项目,但程序给出的结果不正确
- c - C 代码中终端的错误输出(使用 argc)