有很多关于流的问题,但对于这个用例& 在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个元素的子溪流)
不是问题的确切解决方案,但如果你有关于索引的信息,那么组合的 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);
希望能对大家有所帮助。