我可以将一个流分割成多个小流吗?

问题描述 投票:0回答:1

有很多关于流的问题,但对于这个用例& 在java中,没有找到任何问题。

我有一个巨大的对象流 Stream<A> [约100万个对象]。StreamA来自于一个文件。

Class A { enum status [Running,queued,Completed], String name }

我想拆分 Stream<A> 成三个流,而不使用任何Collect语句。Collect语句将所有东西都加载到内存中。

我面临StackOverflowException,因为我在这里多次调用stream.concat。

Stream.Concat在Java文档中提到的问题是 "实现注意:当从重复的连接中构建流时要小心。Accessing an element of a deeply concatenated stream can result in deep call chains, or even StackOverflowException."

Map<Status, Stream<String>> splitStream = new HashMap<>();
streamA.foreach(aObj -> 
Stream<String> statusBasedStream = splitStream.getOrDefault(aObj.status,Stream.of());
splitStream.put(aObj.status, Stream.concat(statusBasedStream, Stream.of(aObj.name))); 

在github中,有一些选项,自定义的流可以实现Concatenation,但想使用标准库来解决这个问题。

如果数据较小会采取这里提到的列表方式(将溪流分成有N个元素的子溪流)

java java-8 stream
1个回答
0
投票

不是问题的确切解决方案,但如果你有关于索引的信息,那么组合的 Stream.skip()Stream.limit() 可以帮助这个 - 以下是我试过的虚拟代码------。

    int queuedNumbers = 100;
    int runningNumbers=200;
    Stream<Object> all = Stream.of();
    Stream<Object> queuedAndCompleted = all.skip(queuedNumbers);
    Stream<Object> queued = all.limit(queuedNumbers);
    Stream<Object> running = queuedAndCompleted.limit(runningNumbers);
    Stream<Object> completed = queuedAndCompleted.skip(runningNumbers);

希望能对大家有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.