CollectorMutability
WARNING
FragileCode
Summary
Avoid
Collectors.to{List,Map,Set}in favor of collectors that emphasize (im)mutability
Suppression
Suppress false positives by adding the suppression annotation
@SuppressWarnings("CollectorMutability")to the enclosing element.Disable this pattern completely by adding
-Xep:CollectorMutability:OFFas compiler argument. Learn more.
Samples
Replacement
Shows the difference in example code before and after the bug pattern is applied.
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.common.collect.ImmutableMap.toImmutableMap;
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
 import static java.util.stream.Collectors.toList;
 import static java.util.stream.Collectors.toMap;
 import static java.util.stream.Collectors.toSet;
 
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import reactor.core.publisher.Flux;
 
 class A {
   void m() {
-    Flux.just(1).collect(Collectors.toList());
-    Flux.just(2).collect(toList());
+    Flux.just(1).collect(toImmutableList());
+    Flux.just(2).collect(toImmutableList());
 
-    Stream.of("foo").collect(Collectors.toMap(String::getBytes, String::length));
-    Stream.of("bar").collect(toMap(String::getBytes, String::length));
-    Flux.just("baz").collect(Collectors.toMap(String::getBytes, String::length, (a, b) -> b));
-    Flux.just("qux").collect(toMap(String::getBytes, String::length, (a, b) -> b));
+    Stream.of("foo").collect(toImmutableMap(String::getBytes, String::length));
+    Stream.of("bar").collect(toImmutableMap(String::getBytes, String::length));
+    Flux.just("baz").collect(toImmutableMap(String::getBytes, String::length, (a, b) -> b));
+    Flux.just("qux").collect(toImmutableMap(String::getBytes, String::length, (a, b) -> b));
 
-    Stream.of(1).collect(Collectors.toSet());
-    Stream.of(2).collect(toSet());
+    Stream.of(1).collect(toImmutableSet());
+    Stream.of(2).collect(toImmutableSet());
   }
 }
 +import static java.util.stream.Collectors.toCollection;
 import static java.util.stream.Collectors.toList;
 import static java.util.stream.Collectors.toMap;
 import static java.util.stream.Collectors.toSet;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import reactor.core.publisher.Flux;
 
 class A {
   void m() {
-    Flux.just(1).collect(Collectors.toList());
-    Flux.just(2).collect(toList());
+    Flux.just(1).collect(toCollection(ArrayList::new));
+    Flux.just(2).collect(toCollection(ArrayList::new));
 
-    Stream.of("foo").collect(Collectors.toMap(String::getBytes, String::length));
-    Stream.of("bar").collect(toMap(String::getBytes, String::length));
-    Flux.just("baz").collect(Collectors.toMap(String::getBytes, String::length, (a, b) -> b));
-    Flux.just("qux").collect(toMap(String::getBytes, String::length, (a, b) -> b));
+    Stream.of("foo")
+        .collect(
+            Collectors.toMap(
+                String::getBytes,
+                String::length,
+                (a, b) -> {
+                  throw new IllegalStateException();
+                },
+                HashMap::new));
+    Stream.of("bar")
+        .collect(
+            toMap(
+                String::getBytes,
+                String::length,
+                (a, b) -> {
+                  throw new IllegalStateException();
+                },
+                HashMap::new));
+    Flux.just("baz")
+        .collect(Collectors.toMap(String::getBytes, String::length, (a, b) -> b, HashMap::new));
+    Flux.just("qux").collect(toMap(String::getBytes, String::length, (a, b) -> b, HashMap::new));
 
-    Stream.of(1).collect(Collectors.toSet());
-    Stream.of(2).collect(toSet());
+    Stream.of(1).collect(toCollection(HashSet::new));
+    Stream.of(2).collect(toCollection(HashSet::new));
   }
 }
 Identification
Shows code lines which will (not) be flagged by this bug pattern. 
A //BUG: Diagnostic contains: comment is placed above any violating line.
import static com.google.common.collect.ImmutableList.toImmutableList;
import static com.google.common.collect.ImmutableMap.toImmutableMap;
import static com.google.common.collect.ImmutableSet.toImmutableSet;
import static java.util.stream.Collectors.toCollection;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toMap;
import static java.util.stream.Collectors.toSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import reactor.core.publisher.Flux;
class A {
  void m() {
    // BUG: Diagnostic contains:
    Flux.just(1).collect(Collectors.toList());
    // BUG: Diagnostic contains:
    Flux.just(2).collect(toList());
    Flux.just(3).collect(toImmutableList());
    Flux.just(4).collect(toCollection(ArrayList::new));
    // BUG: Diagnostic contains:
    Flux.just("foo").collect(Collectors.toMap(String::getBytes, String::length));
    // BUG: Diagnostic contains:
    Flux.just("bar").collect(toMap(String::getBytes, String::length));
    Flux.just("baz").collect(toImmutableMap(String::getBytes, String::length));
    // BUG: Diagnostic contains:
    Flux.just("qux").collect(toMap(String::getBytes, String::length, (a, b) -> a));
    Flux.just("quux").collect(toImmutableMap(String::getBytes, String::length, (a, b) -> a));
    Flux.just("quuz").collect(toMap(String::getBytes, String::length, (a, b) -> a, HashMap::new));
    // BUG: Diagnostic contains:
    Stream.of(1).collect(Collectors.toSet());
    // BUG: Diagnostic contains:
    Stream.of(2).collect(toSet());
    Stream.of(3).collect(toImmutableSet());
    Stream.of(4).collect(toCollection(HashSet::new));
    Flux.just("foo").collect(Collectors.joining());
  }
}