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. ------------- Commit messages: - 8362958: Unnecessary copying / sorting in Streams using Comparator.naturalOrder() Changes: https://git.openjdk.org/jdk/pull/28226/files Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=28226&range=00 Issue: https://bugs.openjdk.org/browse/JDK-8362958 Stats: 19 lines in 4 files changed: 14 ins; 0 del; 5 mod Patch: https://git.openjdk.org/jdk/pull/28226.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/28226/head:pull/28226 PR: https://git.openjdk.org/jdk/pull/28226
