Collectors.toSet() small performance improvement
Aleksey Shipilev
aleksey.shipilev at gmail.com
Tue Aug 9 07:12:07 UTC 2016
On 08/09/2016 08:31 AM, Tagir F. Valeev wrote:
> --- a/src/java.base/share/classes/java/util/stream/Collectors.java Tue Aug 02 07:19:06 2016 +0530
> +++ b/src/java.base/share/classes/java/util/stream/Collectors.java Tue Aug 09 11:47:20 2016 +0700
> @@ -295,7 +295,12 @@
> public static <T>
> Collector<T, ?, Set<T>> toSet() {
> return new CollectorImpl<>((Supplier<Set<T>>) HashSet::new, Set::add,
> - (left, right) -> { left.addAll(right); return left; },
> + (left, right) -> {
> + if (left.size() < right.size()) {
> + right.addAll(left); return right;
> + }
> + left.addAll(right); return left;
> + },
> CH_UNORDERED_ID);
> }
Good trick, but does it work properly with the sets that care about the
add order, e.g. LinkedHashSet? I guess our saving grace here is
Collector.toSet() is declared UNORDERED, so we can disturb the encounter
order without violating the API contract.
I would make it a bit cleaner though:
(left, right) -> {
if (left.size() < right.size()) {
right.addAll(left); return right;
} else {
left.addAll(right); return left;
}
}
Thanks,
-Aleksey
More information about the core-libs-dev
mailing list