Skip to content

Commit 634bd4d

Browse files
committed
8362958: Optimize Stream sorting with Comparator.naturalOrder()
1 parent 43afce5 commit 634bd4d

File tree

4 files changed

+19
-5
lines changed

4 files changed

+19
-5
lines changed

src/java.base/share/classes/java/util/stream/SortedOps.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ static <T> Stream<T> makeRef(AbstractPipeline<?, T, ?> upstream) {
6060
*/
6161
static <T> Stream<T> makeRef(AbstractPipeline<?, T, ?> upstream,
6262
Comparator<? super T> comparator) {
63-
return new OfRef<>(upstream, comparator);
63+
return Comparator.naturalOrder().equals(comparator) ?
64+
new OfRef<>(upstream) : new OfRef<>(upstream, comparator);
6465
}
6566

6667
/**

src/java.base/share/classes/java/util/stream/StreamOpFlag.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
*/
2525
package java.util.stream;
2626

27+
import java.util.Comparator;
2728
import java.util.EnumMap;
2829
import java.util.Map;
2930
import java.util.Spliterator;
@@ -738,17 +739,19 @@ static int toCharacteristics(int streamFlags) {
738739
*
739740
* @implSpec
740741
* If the spliterator is naturally {@code SORTED} (the associated
741-
* {@code Comparator} is {@code null}) then the characteristic is converted
742-
* to the {@link #SORTED} flag, otherwise the characteristic is not
743-
* converted.
742+
* {@code Comparator} is {@code null} or {@code Comparator.naturalOrder()}) then
743+
* the characteristic is converted to the {@link #SORTED} flag, otherwise
744+
* the characteristic is not converted.
744745
*
745746
* @param spliterator the spliterator from which to obtain characteristic
746747
* bit set.
747748
* @return the stream flags.
748749
*/
749750
static int fromCharacteristics(Spliterator<?> spliterator) {
750751
int characteristics = spliterator.characteristics();
751-
if ((characteristics & Spliterator.SORTED) != 0 && spliterator.getComparator() != null) {
752+
if ((characteristics & Spliterator.SORTED) != 0 &&
753+
!(spliterator.getComparator() == null ||
754+
spliterator.getComparator().equals(Comparator.naturalOrder()))) {
752755
// Do not propagate the SORTED characteristic if it does not correspond
753756
// to a natural sort order
754757
return characteristics & SPLITERATOR_CHARACTERISTICS_MASK & ~Spliterator.SORTED;

test/jdk/java/util/stream/boottest/java.base/java/util/stream/StreamOpFlagsTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,5 +377,10 @@ public Comparator<? super Object> getComparator() {
377377
int flags = StreamOpFlag.fromCharacteristics(new SortedEmptySpliterator((a, b) -> 0));
378378
assertEquals(flags, 0);
379379
}
380+
381+
{
382+
int flags = StreamOpFlag.fromCharacteristics(new SortedEmptySpliterator(Comparator.naturalOrder()));
383+
assertEquals(flags, StreamOpFlag.IS_SORTED);
384+
}
380385
}
381386
}

test/jdk/java/util/stream/test/org/openjdk/tests/java/util/stream/SortedOpTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.testng.annotations.Test;
2626

2727
import java.util.*;
28+
import java.util.Comparator;
2829
import java.util.Spliterators;
2930
import java.util.concurrent.atomic.AtomicInteger;
3031
import java.util.function.BiFunction;
@@ -115,10 +116,14 @@ public void testSorted() {
115116

116117
Collections.reverse(to10);
117118
assertSorted(to10.stream().sorted().iterator());
119+
assertSorted(to10.stream().sorted(Comparator.naturalOrder()).iterator());
118120

119121
Spliterator<Integer> s = to10.stream().sorted().spliterator();
120122
assertTrue(s.hasCharacteristics(Spliterator.SORTED));
121123

124+
s = to10.stream().sorted(Comparator.naturalOrder()).spliterator();
125+
assertTrue(s.hasCharacteristics(Spliterator.SORTED));
126+
122127
s = to10.stream().sorted(cInteger.reversed()).spliterator();
123128
assertFalse(s.hasCharacteristics(Spliterator.SORTED));
124129
}

0 commit comments

Comments
 (0)