【发布时间】:2017-07-21 17:53:08
【问题描述】:
当我使用AbstractSpliterator 实现时,我得到了一个java.lang.OutOfMemoryError: Java heap space,它报告了一个未知的大小。
在这种情况下,我定义了一个类StreamCollapse,它扩展了AbstractSpliterator,并在tryAdvance() 实现中合并了一系列相邻元素。它的构造函数调用超级构造函数为super(Long.MAX_VALUE, source.characteristics())。
关于API documentation 我期待使用Long.MAX_VALUE 表示未知大小。但是,它似乎正在尝试分配具有该大小的内存。
它为什么要分配那个空间?估计大小应该使用什么值?
这是一个示例测试:
Stream<Integer> nrs = Stream.of(3, 3, 5, 5, 3, 3, 3, 4, 4, 4 ,5 , 5);
Integer [] expected = {3, 5, 3, 4, 5};
Object[] actual = collapse(nrs).toArray();
assertEquals(actual, expected);
以及collapse()方法实现:
static <T> Stream<T> collapse(Stream<T> source) {
return StreamSupport.stream(
new StreamCollapse<T>(source.spliterator()), false);
}
class StreamCollapse<T> extends AbstractSpliterator<T> implements Consumer<T> {
private final Spliterator<T> source;
private T curr = null;
StreamCollapse(Spliterator<T> source) {
super(Long.MAX_VALUE, source.characteristics());
this.source = source;
}
@Override
public boolean tryAdvance(Consumer<? super T> action) {
T prev = curr;
boolean hasNext;
while ((hasNext = source.tryAdvance(this)) && curr.equals(prev)) { }
if(hasNext) action.accept(curr);
return hasNext;
}
@Override
public void accept(T item) {
curr = item;
}
}
【问题讨论】:
标签: java-8 java-stream