On 08/12/2013 11:17 AM, Paul Sandoz wrote:
On Aug 9, 2013, at 9:01 PM, Mike Duigou <mike.dui...@oracle.com> wrote:
On Aug 9 2013, at 06:04 , Paul Sandoz wrote:

Hi Peter,

On Aug 8, 2013, at 12:44 PM, Peter Levart <peter.lev...@gmail.com> wrote:

Hi Paul,

Shouldn't Spliterators.EmptySpliterator also be IMMUTABLE, DISTINCT and 
ORDERED? Like Collections.singletonSpliterator...

Perhaps, for consistency. IIRC at the time it was felt a little odd to declare 
such characteristics when no elements are present.
Not commenting on the specific decisions but to express general policy:

For the empty/singleton cases it seems like the flags should match as close as possible those which 
would be found on a "real" collection used in the same context. The 
"specialness" of singleton/empty should be mostly for source efficiency and not alter the 
computation.
To be clear: computation may be altered (that is the why the characteristics are useful) 
but the results should be consistent. The characteristics allow for "wiggle 
room" to optimize.

This email thread promoted to me think a little more and while i don't think 
there is any issue spliterators of empty collections, there could be an issue 
with singletons when used with flatMap.

   Collections.singletonList(1).flatMap(x -> Stream.of(1, 2, 3)).parallel()...
   Collections.singleton(1).flatMap(x -> Stream.of(1, 2, 3)).parallel()...

The first stream should retain encounter order for 1 substituted for 1, 2, 3, 
where as the second stream does not have to. It just so happens the current 
flatMap implementation imputes order and thus preserves any order (elements are 
substituted sequentially at the leafs after splitting has occurred, which for 
this case is no splits).

The flatMap implementation could change to have better parallel performance, 
although it is currently hard to imagine it doing so at least for JDK 8. To be 
on the safe side the shared singleton implementation should report ORDERED 
(which it currently does), but this implies we will need to specify this for 
any shared use between singleton collections.

OK, i am gonna about turn on singletons, and keep things simple, and update the 
package private Collection.singletonSpliterator to take a characteristics 
parameter to ensure consistency with the collection type.

Hi Paul,

Concatenating two ORDERED streams normally produces an ORDERED stream. Now if one is concatenating an ORDERED stream with an empty stream, what comes out should also be an ORDERED stream, don't you think?

Regards, Peter



There are currently no type safe ways to obtain a singleton 
NavigableMap/SortedSet, but perhaps there could be in the future? (there was 
probably a good reason for not adding them with the empty versions but i dunno 
what that reason was).
They weren't added mostly to keep the scope of adding the 
checked/unmodifiable/synchronized issue from being too involved. They could 
still be added.

OK.


Reporting SORTED for all singletons is problematic because the singleton 
element may not be Comparable.
There's also the question of what to do when someone calls sort on it. There's an 
open question on whether Collections.sort should pre-check for size <= 1 and do 
nothing rather than throw UOE for Collections.singletonList(). It turns out most 
people find the UOE merely annoying and not useful.

AFAICT:

- Collections/Arrays.sort do not throw UOE and 
Collections.singletonList(...).sort(...) is a no-op.

- Collections.unmodifiableList(...).sort(...) throws a UOE.

In a hybrid world of the mutable and unmodifiable it is likely there will be 
subtle differences:

   Collections.singletonList(1).sort(...)

   List l = new ArrayList(Arrays.asList(1));
   l.sort(...);

   Collections.unmodifiableList(l).sort(...)


When can i have persistent collections in Java? :-)

Paul.

Reply via email to