From cff6d034d1ef909ab6e050f21a9ead1d36190292 Mon Sep 17 00:00:00 2001 From: redestad Date: Thu, 30 May 2024 14:40:33 +0200 Subject: [PATCH 1/3] De-duplicate identical lambdas in FindOps --- .../classes/java/util/stream/FindOps.java | 42 ++++++++++--------- .../java/util/stream/ops/ref/FindAny.java | 6 +++ 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/java.base/share/classes/java/util/stream/FindOps.java b/src/java.base/share/classes/java/util/stream/FindOps.java index 131eec062366c..e33ad30b75761 100644 --- a/src/java.base/share/classes/java/util/stream/FindOps.java +++ b/src/java.base/share/classes/java/util/stream/FindOps.java @@ -194,13 +194,14 @@ public Optional get() { return hasValue ? Optional.of(value) : null; } - static final TerminalOp OP_FIND_FIRST = new FindOp<>(true, - StreamShape.REFERENCE, Optional.empty(), - Optional::isPresent, FindSink.OfRef::new); - - static final TerminalOp OP_FIND_ANY = new FindOp<>(false, - StreamShape.REFERENCE, Optional.empty(), - Optional::isPresent, FindSink.OfRef::new); + private static final Predicate> IS_PRESENT = Optional::isPresent; + private static final Supplier>> NEW + = FindOps.FindSink.OfRef::new; + static final FindOp OP_FIND_FIRST = new FindOp<>(true, + StreamShape.REFERENCE, Optional.empty(), IS_PRESENT, NEW); + + static final FindOp OP_FIND_ANY = new FindOp<>(false, + StreamShape.REFERENCE, Optional.empty(), IS_PRESENT, NEW); } /** Specialization of {@code FindSink} for int streams */ @@ -217,12 +218,13 @@ public OptionalInt get() { return hasValue ? OptionalInt.of(value) : null; } + private static final Predicate IS_PRESENT = OptionalInt::isPresent; + private static final Supplier> NEW + = FindOps.FindSink.OfInt::new; static final TerminalOp OP_FIND_FIRST = new FindOp<>(true, - StreamShape.INT_VALUE, OptionalInt.empty(), - OptionalInt::isPresent, FindSink.OfInt::new); + StreamShape.INT_VALUE, OptionalInt.empty(), IS_PRESENT, NEW); static final TerminalOp OP_FIND_ANY = new FindOp<>(false, - StreamShape.INT_VALUE, OptionalInt.empty(), - OptionalInt::isPresent, FindSink.OfInt::new); + StreamShape.INT_VALUE, OptionalInt.empty(), IS_PRESENT, NEW); } /** Specialization of {@code FindSink} for long streams */ @@ -239,12 +241,13 @@ public OptionalLong get() { return hasValue ? OptionalLong.of(value) : null; } + private static final Predicate IS_PRESENT = OptionalLong::isPresent; + private static final Supplier> NEW + = FindOps.FindSink.OfLong::new; static final TerminalOp OP_FIND_FIRST = new FindOp<>(true, - StreamShape.LONG_VALUE, OptionalLong.empty(), - OptionalLong::isPresent, FindSink.OfLong::new); + StreamShape.LONG_VALUE, OptionalLong.empty(), IS_PRESENT, NEW); static final TerminalOp OP_FIND_ANY = new FindOp<>(false, - StreamShape.LONG_VALUE, OptionalLong.empty(), - OptionalLong::isPresent, FindSink.OfLong::new); + StreamShape.LONG_VALUE, OptionalLong.empty(), IS_PRESENT, NEW); } /** Specialization of {@code FindSink} for double streams */ @@ -261,12 +264,13 @@ public OptionalDouble get() { return hasValue ? OptionalDouble.of(value) : null; } + private static final Predicate IS_PRESENT = OptionalDouble::isPresent; + private static final Supplier> NEW + = FindOps.FindSink.OfDouble::new; static final TerminalOp OP_FIND_FIRST = new FindOp<>(true, - StreamShape.DOUBLE_VALUE, OptionalDouble.empty(), - OptionalDouble::isPresent, FindSink.OfDouble::new); + StreamShape.DOUBLE_VALUE, OptionalDouble.empty(), IS_PRESENT, NEW); static final TerminalOp OP_FIND_ANY = new FindOp<>(false, - StreamShape.DOUBLE_VALUE, OptionalDouble.empty(), - OptionalDouble::isPresent, FindSink.OfDouble::new); + StreamShape.DOUBLE_VALUE, OptionalDouble.empty(), IS_PRESENT, NEW); } } diff --git a/test/micro/org/openjdk/bench/java/util/stream/ops/ref/FindAny.java b/test/micro/org/openjdk/bench/java/util/stream/ops/ref/FindAny.java index 217a750ade700..baf43a2e96c4f 100644 --- a/test/micro/org/openjdk/bench/java/util/stream/ops/ref/FindAny.java +++ b/test/micro/org/openjdk/bench/java/util/stream/ops/ref/FindAny.java @@ -60,4 +60,10 @@ public Long par_invoke() { return LongStream.range(0, size).parallel().boxed().findAny().get(); } + public static void main(String... args) { + FindAny findAny = new FindAny(); + findAny.size = 100000; + findAny.seq_invoke(); + findAny.par_invoke(); + } } From a223e608367350c8024d5c9ecba1638e732a7ee4 Mon Sep 17 00:00:00 2001 From: redestad Date: Tue, 18 Jun 2024 09:50:29 +0200 Subject: [PATCH 2/3] @ExE-Boss review --- .../classes/java/util/stream/FindOps.java | 69 +++++++++++-------- 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/src/java.base/share/classes/java/util/stream/FindOps.java b/src/java.base/share/classes/java/util/stream/FindOps.java index e33ad30b75761..37ab00485cd11 100644 --- a/src/java.base/share/classes/java/util/stream/FindOps.java +++ b/src/java.base/share/classes/java/util/stream/FindOps.java @@ -194,14 +194,16 @@ public Optional get() { return hasValue ? Optional.of(value) : null; } - private static final Predicate> IS_PRESENT = Optional::isPresent; - private static final Supplier>> NEW - = FindOps.FindSink.OfRef::new; - static final FindOp OP_FIND_FIRST = new FindOp<>(true, - StreamShape.REFERENCE, Optional.empty(), IS_PRESENT, NEW); - - static final FindOp OP_FIND_ANY = new FindOp<>(false, - StreamShape.REFERENCE, Optional.empty(), IS_PRESENT, NEW); + static final TerminalOp OP_FIND_FIRST, OP_FIND_ANY; + static { + Predicate> isPresent = Optional::isPresent; + Supplier>> 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); + } } /** Specialization of {@code FindSink} for int streams */ @@ -218,13 +220,16 @@ public OptionalInt get() { return hasValue ? OptionalInt.of(value) : null; } - private static final Predicate IS_PRESENT = OptionalInt::isPresent; - private static final Supplier> NEW - = FindOps.FindSink.OfInt::new; - static final TerminalOp OP_FIND_FIRST = new FindOp<>(true, - StreamShape.INT_VALUE, OptionalInt.empty(), IS_PRESENT, NEW); - static final TerminalOp OP_FIND_ANY = new FindOp<>(false, - StreamShape.INT_VALUE, OptionalInt.empty(), IS_PRESENT, NEW); + static final TerminalOp OP_FIND_FIRST, OP_FIND_ANY; + static { + Predicate isPresent = OptionalInt::isPresent; + Supplier 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); + } } /** Specialization of {@code FindSink} for long streams */ @@ -241,13 +246,16 @@ public OptionalLong get() { return hasValue ? OptionalLong.of(value) : null; } - private static final Predicate IS_PRESENT = OptionalLong::isPresent; - private static final Supplier> NEW - = FindOps.FindSink.OfLong::new; - static final TerminalOp OP_FIND_FIRST = new FindOp<>(true, - StreamShape.LONG_VALUE, OptionalLong.empty(), IS_PRESENT, NEW); - static final TerminalOp OP_FIND_ANY = new FindOp<>(false, - StreamShape.LONG_VALUE, OptionalLong.empty(), IS_PRESENT, NEW); + static final TerminalOp OP_FIND_FIRST, OP_FIND_ANY; + static { + Predicate isPresent = OptionalLong::isPresent; + Supplier 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); + } } /** Specialization of {@code FindSink} for double streams */ @@ -264,13 +272,16 @@ public OptionalDouble get() { return hasValue ? OptionalDouble.of(value) : null; } - private static final Predicate IS_PRESENT = OptionalDouble::isPresent; - private static final Supplier> NEW - = FindOps.FindSink.OfDouble::new; - static final TerminalOp OP_FIND_FIRST = new FindOp<>(true, - StreamShape.DOUBLE_VALUE, OptionalDouble.empty(), IS_PRESENT, NEW); - static final TerminalOp OP_FIND_ANY = new FindOp<>(false, - StreamShape.DOUBLE_VALUE, OptionalDouble.empty(), IS_PRESENT, NEW); + static final TerminalOp OP_FIND_FIRST, OP_FIND_ANY; + static { + Predicate isPresent = OptionalDouble::isPresent; + Supplier> 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); + } } } From d83a1c9667db29041ed2d0acf094be0b79154a0e Mon Sep 17 00:00:00 2001 From: redestad Date: Tue, 18 Jun 2024 11:57:25 +0200 Subject: [PATCH 3/3] Fixes --- src/java.base/share/classes/java/util/stream/FindOps.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java.base/share/classes/java/util/stream/FindOps.java b/src/java.base/share/classes/java/util/stream/FindOps.java index 37ab00485cd11..afe31a90bdc0c 100644 --- a/src/java.base/share/classes/java/util/stream/FindOps.java +++ b/src/java.base/share/classes/java/util/stream/FindOps.java @@ -223,7 +223,7 @@ public OptionalInt get() { static final TerminalOp OP_FIND_FIRST, OP_FIND_ANY; static { Predicate isPresent = OptionalInt::isPresent; - Supplier newSink + Supplier> newSink = FindSink.OfInt::new; OP_FIND_FIRST = new FindOp<>(true, StreamShape.INT_VALUE, OptionalInt.empty(), isPresent, newSink); @@ -249,7 +249,7 @@ public OptionalLong get() { static final TerminalOp OP_FIND_FIRST, OP_FIND_ANY; static { Predicate isPresent = OptionalLong::isPresent; - Supplier newSink + Supplier> newSink = FindSink.OfLong::new; OP_FIND_FIRST = new FindOp<>(true, StreamShape.LONG_VALUE, OptionalLong.empty(), isPresent, newSink);