On Thu, 13 Nov 2025 06:46:51 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 StreamOpFlagsTest

I don't know about the particular case about TreeSet, but I think with the 
advent of Comparator.naturalOrder in Java 8, people are much more likely to use 
it instead of null to represent the natural order, especially for 
Comparator-returning methods or Comparator fields. Offering such a conversion 
within the implementation, in my opinion, is better than checking and 
converting at every single use site that has a Comparator.

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

PR Comment: https://git.openjdk.org/jdk/pull/28226#issuecomment-3535108496

Reply via email to