RFR: 8333265: De-duplicate method references in java.util.stream.FindOps

ExE Boss duke at openjdk.org
Thu Jun 6 08:48:46 UTC 2024


On Thu, 30 May 2024 12:50:36 GMT, Claes Redestad <redestad at openjdk.org> wrote:

> Extracting duplicate method references to static field reduce proxy class spinning and loading. In this case 2 less classes loaded when using `findAny()` on each type of stream.

The intermediate `Predicate`s and `Supplier`s don’t need to be fields, and it’s probably better for them to be locals:

src/java.base/share/classes/java/util/stream/FindOps.java line 204:

> 202: 
> 203:             static final FindOp<?, ?> OP_FIND_ANY = new FindOp<>(false,
> 204:                     StreamShape.REFERENCE, Optional.empty(), IS_PRESENT, NEW);

Suggestion:

            static final TerminalOp<?, ?> OP_FIND_FIRST, OP_FIND_ANY;
            static {
                Predicate<Optional<Object>> isPresent = Optional::isPresent;
                Supplier<TerminalSink<Object, Optional<Object>>> newSink
                    = FindSink.OfRef::new;

                OP_FIND_FIRST = new FindOp<>(true, StreamShape.REFERENCE,
                    Optional.empty(), isPresent, newSink);

                OP_FIND_ANY = new FindOp<>(false, StreamShape.REFERENCE,
                    Optional.empty(), isPresent, newSink);
            }

src/java.base/share/classes/java/util/stream/FindOps.java line 227:

> 225:                     StreamShape.INT_VALUE, OptionalInt.empty(), IS_PRESENT, NEW);
> 226:             static final TerminalOp<Integer, OptionalInt> OP_FIND_ANY = new FindOp<>(false,
> 227:                     StreamShape.INT_VALUE, OptionalInt.empty(), IS_PRESENT, NEW);

Suggestion:

            static final TerminalOp<Integer, OptionalInt> OP_FIND_FIRST, OP_FIND_ANY;
            static {
                Predicate<OptionalInt> isPresent = OptionalInt::isPresent;
                Supplier<TerminalSink<Integer, OptionalInt> newSink
                    = FindSink.OfInt::new;

                OP_FIND_FIRST = new FindOp<>(true, StreamShape.INT_VALUE,
                    OptionalInt.empty(), isPresent, newSink);

                OP_FIND_ANY = new FindOp<>(false, StreamShape.INT_VALUE,
                    OptionalInt.empty(), isPresent, newSink);
            }

src/java.base/share/classes/java/util/stream/FindOps.java line 250:

> 248:                     StreamShape.LONG_VALUE, OptionalLong.empty(), IS_PRESENT, NEW);
> 249:             static final TerminalOp<Long, OptionalLong> OP_FIND_ANY = new FindOp<>(false,
> 250:                     StreamShape.LONG_VALUE, OptionalLong.empty(), IS_PRESENT, NEW);

Suggestion:

            static final TerminalOp<Long, OptionalLong> OP_FIND_FIRST, OP_FIND_ANY;
            static {
                Predicate<OptionalLong> isPresent = OptionalLong::isPresent;
                Supplier<TerminalSink<Long, OptionalLong> newSink
                    = FindSink.OfLong::new;

                OP_FIND_FIRST = new FindOp<>(true, StreamShape.LONG_VALUE,
                    OptionalLong.empty(), isPresent, newSink);

                OP_FIND_ANY = new FindOp<>(false, StreamShape.LONG_VALUE,
                    OptionalLong.empty(), isPresent, newSink);
            }

src/java.base/share/classes/java/util/stream/FindOps.java line 273:

> 271:                     StreamShape.DOUBLE_VALUE, OptionalDouble.empty(), IS_PRESENT, NEW);
> 272:             static final TerminalOp<Double, OptionalDouble> OP_FIND_ANY = new FindOp<>(false,
> 273:                     StreamShape.DOUBLE_VALUE, OptionalDouble.empty(), IS_PRESENT, NEW);

Suggestion:

            static final TerminalOp<Double, OptionalDouble> OP_FIND_FIRST, OP_FIND_ANY;
            static {
                Predicate<OptionalDouble> isPresent = OptionalDouble::isPresent;
                Supplier<TerminalSink<Double, OptionalLong> newSink
                    = FindSink.OfDouble::new;

                OP_FIND_FIRST = new FindOp<>(true, StreamShape.DOUBLE_VALUE,
                    OptionalDouble.empty(), isPresent, newSink);

                OP_FIND_ANY = new FindOp<>(false, StreamShape.DOUBLE_VALUE,
                    OptionalDouble.empty(), isPresent, newSink);
            }

-------------

PR Review: https://git.openjdk.org/jdk/pull/19477#pullrequestreview-2101252355
PR Review Comment: https://git.openjdk.org/jdk/pull/19477#discussion_r1629032905
PR Review Comment: https://git.openjdk.org/jdk/pull/19477#discussion_r1629035242
PR Review Comment: https://git.openjdk.org/jdk/pull/19477#discussion_r1629040800
PR Review Comment: https://git.openjdk.org/jdk/pull/19477#discussion_r1629043309


More information about the core-libs-dev mailing list