8238286: Add new flatMap stream operation that is more amenable to pushing

This patch adds a new flatmap-like operation called mapMulti to the java.util.Stream class as well as the primitive variations of this operation i.e. mapMultiToInt, IntStream mapMulti, etc.

Reviewed-by: psandoz, smarks
This commit is contained in:
Patrick Concannon 2020-08-31 16:12:32 +01:00
parent dd89c92c50
commit 79d12507b3
10 changed files with 899 additions and 15 deletions

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -338,6 +338,30 @@ abstract class IntPipeline<E_IN>
};
}
@Override
public final IntStream mapMulti(IntMapMultiConsumer mapper) {
Objects.requireNonNull(mapper);
return new StatelessOp<>(this, StreamShape.INT_VALUE,
StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT | StreamOpFlag.NOT_SIZED) {
@Override
Sink<Integer> opWrapSink(int flags, Sink<Integer> sink) {
return new Sink.ChainedInt<>(sink) {
@Override
public void begin(long size) {
downstream.begin(-1);
}
@Override
@SuppressWarnings("unchecked")
public void accept(int t) {
mapper.accept(t, (IntConsumer) downstream);
}
};
}
};
}
@Override
public IntStream unordered() {
if (!isOrdered())