On Tue, 11 Nov 2025 17:56:19 GMT, Patrick Strawderman <[email protected]> wrote:
>> When `Comparator.naturalOrder()` was explicitly supplied to a collection
>> such as `TreeSet`, or passed into the `sorted` method of a stream, the
>> sorted characteristic was not preserved, causing unnecessary buffering and
>> duplicate sorting.
>>
>> Example:
>>
>>
>> TreeSet<Integer> sortedSet = new TreeSet<>(Comparator.naturalOrder());
>> sortedSet.add(1);
>> sortedSet.add(2);
>> // SortedOps.OfRef.opWrapSink is not a no-op
>> sortedSet.stream().sorted().forEach(System.out::println);
>>
>> or
>>
>> TreeSet<Integer> sortedSet = new TreeSet<>();
>> sortedSet.add(1);
>> sortedSet.add(2);
>> // SortedOps.OfRef.opWrapSink is not a no-op
>> sortedSet.stream().sorted(Comparator.naturalOrder()).forEach(System.out::println);
>>
>>
>> This PR updates `SortedOps.makeRef` and `StreamOpFlag.fromCharacteristics`
>> to handle the above cases and avoid the unnecessary sort step.
>
> Patrick Strawderman has updated the pull request incrementally with one
> additional commit since the last revision:
>
> Fix bad merge
src/java.base/share/classes/java/util/stream/StreamOpFlag.java line 753:
> 751: int characteristics = spliterator.characteristics();
> 752: if ((characteristics & Spliterator.SORTED) != 0 &&
> 753: (spliterator.getComparator() instanceof Comparator c &&
Not sure if the performance of `instanceof` is meaningfully faster than `!=`,
but the `instanceof` test could be replaced with a null test:
if ((characteristics & Spliterator.SORTED) != 0) {
Comparator<?> c = spliterator.getComparator();
if (c != null && !c.equals(Comparator.naturalOrder()) { ...
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/28226#discussion_r2515182450