java - Java8流的 "merge"元素有可能吗?

标签 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.spliterator() 来转义 Stream API。

否则,方法是使用自定义收集器调用终端操作 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;
    }
}

关于java - Java8流的 "merge"元素有可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39229767/

相关文章:

java - java中返回多个值的最轻量级方法

java - Apache POI XWPFTableRow 删除列 Word

java - 创建一个 Map<String,List<Integer>>

java-8 - vaadin 8 日期字段 : Cannot cast java. time.LocalDate 到 java.util.Date

java - 如何解决JavaFX中Scene Builder不响应的问题?

java - 使用 Java 8 流解析字符串

java - 无法解析 Java 8 中的构造函数

java - 如何在linux命令中编译java包

java - 在 Spring Boot/执行器根端点上返回 404

java - JLS 是否需要内联最终字符串常量?