Wenn Sie es faul sein wollen, müssen Sie den Stream-API durch Stream.iterator()
oder Stream.spliterator()
entkommen.
Ansonsten ist der Weg, es zu tun ist, um den Terminalbetrieb Stream.collect(Collector)
mit einem benutzerdefinierten Kollektor zu nennen, die den ganzen Strom verbrauchen.
@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;
}
}
In Vanille Java, Single-Pass und ohne Zwischendatenstrukturen: nein . [StreamEx] (https://github.com/amaembo/streamex) Angebote [ 'StreamEx :: runLengths'] (http://amaembo.github.io/streamex/javadoc/one/util/streamex/StreamEx.html# runLengths--) was du suchst. – Flown
Kann ich meine benutzerdefinierten Aggregationsobjekte in 'StreamEx' schreiben? – Dims
Sie können StreamEx als Erweiterung der allgemeinen 'Stream'-API sehen. Es gibt also kein Limit und Sie können eigene Aggregationsobjekte schreiben. – Flown