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