Dim*_*ims 4 java java-8 java-stream
我可以用某种方式分析Java8流的先前和/或下一个元素吗?
例如,我可以计算相同的相邻数字吗?
public class Merge {
   public static void main(String[] args) {
      Stream<Integer> stream = Stream.of(0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1);
      // How to get 3, 2, 2, 4 from above
   }
}
如果你想让它变得懒惰,你必须通过Stream.iterator()或转义Stream API Stream.spliterator().
否则,执行此操作的方法是Stream.collect(Collector)使用自定义收集器调用终端操作,该收集器将使用整个流.
@Test
public void test() {
    Stream<Integer> input = Stream.of(0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1);
    UniqCountSpliterator uniqCountSpliterator = new UniqCountSpliterator(input.spliterator());
    long[] output = uniqCountSpliterator.stream()
            .toArray();
    long[] expected = {3, 2, 2, 4};
    assertArrayEquals(expected, output);
}
import java.util.Spliterator;
import java.util.function.LongConsumer;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
public class UniqCountSpliterator implements Spliterator.OfLong {
    private Spliterator wrapped;
    private long count;
    private Object previous;
    private Object current;
    public UniqCountSpliterator(Spliterator wrapped) {
        this.wrapped = wrapped;
    }
    public LongStream stream() {
        return StreamSupport.longStream(this, false);
    }
    @Override
    public OfLong trySplit() {
        return null;
    }
    @Override
    public long estimateSize() {
        return Long.MAX_VALUE;
    }
    @Override
    public int characteristics() {
        return NONNULL | IMMUTABLE;
    }
    @Override
    public boolean tryAdvance(LongConsumer action) {
        while (wrapped.tryAdvance(next -> current = next) && (null == previous || current.equals(previous))) {
            count++;
            previous = current;
        }
        if (previous == null) {
            return false;
        }
        action.accept(count);
        count = 1;
        previous = null;
        return true;
    }
}
| 归档时间: | 
 | 
| 查看次数: | 1719 次 | 
| 最近记录: |