There doesn’t appear to be any straightforward way to sort a List
in parallel in Java 8. I don’t think this is fundamentally difficult; it looks more like an oversight to me.
The difficulty with a hypothetical Collections.parallelSort(list, cmp)
is that the Collections
implementation knows nothing about the list’s implementation or its internal organization. This can be seen by examining the Java 7 implementation of Collections.sort(list, cmp)
. As you observed, it has to copy the list elements out to an array, sort them, and then copy them back into the list.
This is the big advantage of the List.sort(cmp)
extension method over Collections.sort(list, cmp)
. It might seem that this is merely a small syntactic advantage being able to write myList.sort(cmp)
instead of Collections.sort(myList, cmp)
. The difference is that myList.sort(cmp)
, being an interface extension method, can be overridden by the specific List
implementation. For example, ArrayList.sort(cmp)
sorts the list in-place using Arrays.sort()
whereas the default implementation implements the old copyout-sort-copyback technique.
It should be possible to add a parallelSort
extension method to the List
interface that has similar semantics to List.sort
but does the sorting in parallel. This would allow ArrayList
to do a straightforward in-place sort using Arrays.parallelSort
. (It’s not entirely clear to me what the default implementation should do. It might still be worth it to do copyout-parallelSort-copyback.) Since this would be an API change, it can’t happen until the next major release of Java SE.
As for a Java 8 solution, there are a couple workarounds, none very pretty (as is typical of workarounds). You could create your own array-based List
implementation and override sort()
to sort in parallel. Or you could subclass ArrayList
, override sort()
, grab the elementData
array via reflection and call parallelSort()
on it. Of course you could just write your own List
implementation and provide a parallelSort()
method, but the advantage of overriding List.sort()
is that this works on the plain List
interface and you don’t have to modify all the code in your code base to use a different List
subclass.