diff --git a/src/java.base/share/classes/java/util/stream/StreamSpliterators.java b/src/java.base/share/classes/java/util/stream/StreamSpliterators.java index a098bb2f2ac..196cd76c8f8 100644 --- a/src/java.base/share/classes/java/util/stream/StreamSpliterators.java +++ b/src/java.base/share/classes/java/util/stream/StreamSpliterators.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -248,6 +248,11 @@ class StreamSpliterators { c |= (spliterator.characteristics() & (Spliterator.SIZED | Spliterator.SUBSIZED)); } + // It's not allowed for a Spliterator to report SORTED if not also ORDERED + if ((c & Spliterator.SORTED) != 0 && (c & Spliterator.ORDERED) == 0) { + c &= ~(Spliterator.SORTED); + } + return c; } diff --git a/test/jdk/java/util/stream/test/org/openjdk/tests/java/util/stream/StreamSpliteratorTest.java b/test/jdk/java/util/stream/test/org/openjdk/tests/java/util/stream/StreamSpliteratorTest.java index d3b0d254c41..1a281885b31 100644 --- a/test/jdk/java/util/stream/test/org/openjdk/tests/java/util/stream/StreamSpliteratorTest.java +++ b/test/jdk/java/util/stream/test/org/openjdk/tests/java/util/stream/StreamSpliteratorTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -605,6 +605,27 @@ public class StreamSpliteratorTest extends OpTestCase { } } + @Test + public void testCharacteristicsForSortedUnorderedStreamSpliterators() { + assertValidCombinationOfSortedAndOrdered( + DoubleStream.of(3d,2d,4d,1d,5d).sorted().unordered().spliterator() + ); + assertValidCombinationOfSortedAndOrdered( + IntStream.of(3,2,4,1,5).sorted().unordered().spliterator() + ); + assertValidCombinationOfSortedAndOrdered( + LongStream.of(3L,2L,4L,1L,5L).sorted().unordered().spliterator() + ); + assertValidCombinationOfSortedAndOrdered( + Stream.of(3,2,4,1,5).sorted().unordered().spliterator() + ); + } + + void assertValidCombinationOfSortedAndOrdered(Spliterator s) { + if (s.hasCharacteristics(Spliterator.SORTED)) + Assert.assertTrue(s.hasCharacteristics(Spliterator.ORDERED)); + } + private List> doubleStreamFunctions; List> doubleStreamFunctions() {