Remove Characteristics manipulation in Collectors

Collector.Characteristics is used only for optimizations
and unused by current GWT emulation.
Removing logic around the piping of Characteristics
is slightly incompatible with JRE however gets rid
of the all the extra logic required in most code paths
for streams plus drops the extra EnumSet dependency from
the code and compiler optimization will probably drop
Characteristics class and its metadata as well.

Change-Id: I98e951760aa82e3225997c86e2bec4492284c8ac
Review-Link: https://gwt-review.googlesource.com/#/c/18080/
diff --git a/user/super/com/google/gwt/emul/java/util/stream/Collector.java b/user/super/com/google/gwt/emul/java/util/stream/Collector.java
index c3907ef..4e58835 100644
--- a/user/super/com/google/gwt/emul/java/util/stream/Collector.java
+++ b/user/super/com/google/gwt/emul/java/util/stream/Collector.java
@@ -17,8 +17,6 @@
 
 import static javaemul.internal.InternalPreconditions.checkNotNull;
 
-import java.util.Collections;
-import java.util.EnumSet;
 import java.util.Set;
 import java.util.function.BiConsumer;
 import java.util.function.BinaryOperator;
@@ -53,13 +51,7 @@
     checkNotNull(combiner);
     checkNotNull(finisher);
     checkNotNull(characteristics);
-    return new CollectorImpl<>(
-        supplier,
-        accumulator,
-        combiner,
-        finisher,
-        characteristics
-    );
+    return new CollectorImpl<>(supplier, accumulator, combiner, finisher, characteristics);
   }
 
   static <T, R> Collector<T, R, R> of(
@@ -72,12 +64,7 @@
     checkNotNull(combiner);
     checkNotNull(characteristics);
     return new CollectorImpl<T, R, R>(
-        supplier,
-        accumulator,
-        combiner,
-        Function.identity(),
-        Collections.unmodifiableSet(EnumSet.of(Characteristics.IDENTITY_FINISH, characteristics))
-    );
+        supplier, accumulator, combiner, Function.identity(), characteristics);
   }
 
   Supplier<A> supplier();
@@ -89,4 +76,4 @@
   BinaryOperator<A> combiner();
 
   Function<A,R> finisher();
-}
\ No newline at end of file
+}
diff --git a/user/super/com/google/gwt/emul/java/util/stream/CollectorImpl.java b/user/super/com/google/gwt/emul/java/util/stream/CollectorImpl.java
index 9202a28..1ff23d1 100644
--- a/user/super/com/google/gwt/emul/java/util/stream/CollectorImpl.java
+++ b/user/super/com/google/gwt/emul/java/util/stream/CollectorImpl.java
@@ -16,7 +16,6 @@
 package java.util.stream;
 
 import java.util.Collections;
-import java.util.EnumSet;
 import java.util.Set;
 import java.util.function.BiConsumer;
 import java.util.function.BinaryOperator;
@@ -41,31 +40,11 @@
       Characteristics... characteristics) {
     this.supplier = supplier;
     this.accumulator = accumulator;
-    if (characteristics.length == 0) {
-      this.characteristics = Collections.emptySet();
-    } else if (characteristics.length == 1) {
-      this.characteristics = Collections.singleton(characteristics[0]);
-    } else {
-      this.characteristics =
-          Collections.unmodifiableSet(EnumSet.of(characteristics[0], characteristics));
-    }
+    this.characteristics = Collections.emptySet();
     this.combiner = combiner;
     this.finisher = finisher;
   }
 
-  public CollectorImpl(
-      Supplier<A> supplier,
-      BiConsumer<A, T> accumulator,
-      BinaryOperator<A> combiner,
-      Function<A, R> finisher,
-      Set<Characteristics> characteristics) {
-    this.supplier = supplier;
-    this.accumulator = accumulator;
-    this.combiner = combiner;
-    this.finisher = finisher;
-    this.characteristics = characteristics;
-  }
-
   @Override
   public Supplier<A> supplier() {
     return supplier;
diff --git a/user/super/com/google/gwt/emul/java/util/stream/Collectors.java b/user/super/com/google/gwt/emul/java/util/stream/Collectors.java
index 65edfa5..d19f64c 100644
--- a/user/super/com/google/gwt/emul/java/util/stream/Collectors.java
+++ b/user/super/com/google/gwt/emul/java/util/stream/Collectors.java
@@ -18,10 +18,8 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Comparator;
 import java.util.DoubleSummaryStatistics;
-import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.IntSummaryStatistics;
@@ -68,8 +66,7 @@
         downstream.supplier(),
         downstream.accumulator(),
         downstream.combiner(),
-        downstream.finisher().andThen(finisher),
-        removeIdentFinisher(downstream.characteristics()));
+        downstream.finisher().andThen(finisher));
   }
 
   public static <T> Collector<T,?,Long> counting() {
@@ -170,8 +167,7 @@
               downstream.accumulator().accept(a, mapper.apply(t));
             },
         downstream.combiner(),
-        downstream.finisher(),
-        downstream.characteristics());
+        downstream.finisher());
   }
 
   public static <T> Collector<T,?,Optional<T>> maxBy(Comparator<? super T> comparator) {
@@ -361,21 +357,6 @@
     );
   }
 
-  private static Set<Collector.Characteristics> removeIdentFinisher(
-      Set<Collector.Characteristics> characteristics) {
-    if (!characteristics.contains(Collector.Characteristics.IDENTITY_FINISH)) {
-      return characteristics;
-    }
-
-    if (characteristics.size() == 1) {
-      return Collections.emptySet();
-    }
-
-    EnumSet<Collector.Characteristics> result = EnumSet.copyOf(characteristics);
-    result.remove(Collector.Characteristics.IDENTITY_FINISH);
-    return Collections.unmodifiableSet(result);
-  }
-
   private static <T, D, A> D streamAndCollect(Collector<? super T, A, D> downstream, List<T> list) {
     A a = downstream.supplier().get();
     for (T t : list) {