Java 平面地图迭代器<对<流<A>, 流<B>>> 到配对<流<A>, 流<B>>
2022-09-04 01:44:51
我正在尝试使用以下签名实现方法:
public static <A,B> Pair<Stream<A>, Stream<B>> flatten(Iterator<Pair<Stream<A>, Stream<B>>> iterator);
其中,该方法的目标是将每个流类型平展为单个流,并将输出包装成一对。我只有一个迭代器(不是迭代器),我无法更改方法签名,因此我必须在一次迭代中执行平展。
我目前最好的实现是
public static <A,B> Pair<Stream<A>, Stream<B>> flatten(Iterator<Pair<Stream<A>, Stream<B>> iterator) {
Stream<A> aStream = Stream.empty();
Stream<B> bStream = Stream.empty();
while(iterator.hasNext()) {
Pair<Stream<A>, Stream<B>> elm = iterator.next();
aStream = Stream.concat(aStream, elm.first);
bStream = Stream.concat(bStream, elm.second);
}
return Pair.of(aStream, bStream);
}
但是,虽然这在技术上是正确的,但我对此并不满意,原因有两个:
- Stream.concat警告不要做这种事情,因为它可能导致StackOverflowError。
- 从风格上讲,如果可能的话,我宁愿它是纯粹的功能,而不是必须循环访问迭代器并重新分配整个流。
感觉Stream#flatMap应该适合这里(在使用Guava的Streams.stream(Iterator)将输入迭代器转换为Stream之后),但由于中间的Paper类型,它似乎不起作用。
另一个要求是,任何迭代器/流都可能非常大(例如,输入可能包含从一对非常大的流到许多一个项目流的任何地方),因此理想情况下,解决方案不应包含将结果收集到内存中集合中。