RFR: JDK-8319123 : Implementation of JEP-461: Stream Gatherers (Preview)
Viktor Klang
vklang at openjdk.org
Wed Nov 8 17:56:08 UTC 2023
On Wed, 8 Nov 2023 17:24:45 GMT, Rémi Forax <forax at openjdk.org> wrote:
>> This Pull-Request implements [JEP-461](https://openjdk.org/jeps/461)
>
> src/java.base/share/classes/java/util/stream/Gatherer.java line 530:
>
>> 528: * @param <R> the type of results this integrator can produce
>> 529: */
>> 530: @ForceInline
>
> If we add this kind of the methods, we should add them on all function interfaces of java.util.function and java.util.stream.
Seems out of scope for this JEP
> src/java.base/share/classes/java/util/stream/GathererOp.java line 50:
>
>> 48: */
>> 49: final class GathererOp<T, A, R> extends ReferencePipeline<T, R> {
>> 50: @SuppressWarnings("unchecked")
>
> Could you explain why you need a SuppressWarnings here, especially the cast to (ReferencePipeline<?,T>) in the else case
Suggested improvements are most welcome! 👍
> src/java.base/share/classes/java/util/stream/GathererOp.java line 95:
>
>> 93: public void accept(X x) {
>> 94: final var b = rightMost;
>> 95: (b == null ? (rightMost = new NodeBuilder.Builder<>()) : b).accept(x);
>
> I think this code is unecessarily hard to read.
>
> var rightMost = this.rightMost;
> if (rightMost == null) {
> rightMost = this.rightMost = new NodeBuilder.Builder<>();
> }
> rightMost.accept(x);
Benchmark your change first. If it is cost-neutral I'm all for changing!
> src/java.base/share/classes/java/util/stream/GathererOp.java line 180:
>
>> 178: finisher.accept(state, this);
>> 179: sink.end();
>> 180: state = null; // GC assistance
>
> Not sure it really helps the GC, given that it may go through a GC barrier
When it helps, it helps, and when it doesn't it has negligible cost.
> src/java.base/share/classes/java/util/stream/GathererOp.java line 232:
>
>> 230: */
>> 231: @SuppressWarnings("unchecked")
>> 232: private GathererOp(Gatherer<T, A, R> gatherer, GathererOp<?, ?, T> upstream) {
>
> Is it not better to use a static method named by example `fuse`, i don't understand why it has to be a constructor.
It is only ever exposed via a static method.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/16420#discussion_r1386998422
PR Review Comment: https://git.openjdk.org/jdk/pull/16420#discussion_r1386999183
PR Review Comment: https://git.openjdk.org/jdk/pull/16420#discussion_r1387000558
PR Review Comment: https://git.openjdk.org/jdk/pull/16420#discussion_r1387002929
PR Review Comment: https://git.openjdk.org/jdk/pull/16420#discussion_r1387003542
More information about the core-libs-dev
mailing list