Some cleanup changes.

--
MOS_MIGRATED_REVID=87821306
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionStatusReporter.java b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionStatusReporter.java
index 34aadc4..f88f137 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionStatusReporter.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionStatusReporter.java
@@ -146,7 +146,7 @@
         actions.add(Pair.of(entry.getValue().second, entry.getKey()));
       }
     }
-    if (actions.size() == 0) {
+    if (actions.isEmpty()) {
       return;
     }
     Collections.sort(actions, Pair.<Long, ActionMetadata>compareByFirst());
@@ -183,7 +183,7 @@
     long currentTime = clock.nanoTime();
 
     // A tree is just as fast as HashSet for small data sets.
-    Set<String> statuses = new TreeSet<String>();
+    Set<String> statuses = new TreeSet<>();
     for (Map.Entry<ActionMetadata, Pair<String, Long>> entry : statusMap.entrySet()) {
       statuses.add(entry.getValue().first);
     }
@@ -200,7 +200,7 @@
   public void showCurrentlyExecutingActions(String progressPercentageMessage) {
     // Defensive copy to ensure thread safety.
     Map<ActionMetadata, Pair<String, Long>> statusMap = new HashMap<>(actionStatus);
-    if (statusMap.size() > 0) {
+    if (!statusMap.isEmpty()) {
       eventHandler.handle(
           Event.progress(progressPercentageMessage + getExecutionStatusMessage(statusMap)));
     }
@@ -213,8 +213,8 @@
   void warnAboutCurrentlyExecutingActions() {
     // Defensive copy to ensure thread safety.
     Map<ActionMetadata, Pair<String, Long>> statusMap = new HashMap<>(actionStatus);
-    if (statusMap.size() == 0) {
-     // There are no tasks in the queue so there is nothing to report.
+    if (statusMap.isEmpty()) {
+      // There are no tasks in the queue so there is nothing to report.
       eventHandler.handle(Event.warn("There are no active jobs - stopping the build"));
       return;
     }
@@ -225,7 +225,7 @@
         iterator.remove();
       }
     }
-    if (statusMap.size() > 0) {
+    if (!statusMap.isEmpty()) {
       eventHandler.handle(Event.warn(getExecutionStatusMessage(statusMap)
           + "\nBuild will be stopped after these tasks terminate"));
     } else {
diff --git a/src/main/java/com/google/devtools/build/lib/actions/MapBasedActionGraph.java b/src/main/java/com/google/devtools/build/lib/actions/MapBasedActionGraph.java
index 2788f2f..d36c6af 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/MapBasedActionGraph.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/MapBasedActionGraph.java
@@ -24,9 +24,8 @@
  */
 @ThreadSafe
 public final class MapBasedActionGraph implements MutableActionGraph {
-
   private final ConcurrentMultimapWithHeadElement<Artifact, Action> generatingActionMap =
-      new ConcurrentMultimapWithHeadElement<Artifact, Action>();
+      new ConcurrentMultimapWithHeadElement<>();
 
   @Override
   @Nullable
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ResourceManager.java b/src/main/java/com/google/devtools/build/lib/actions/ResourceManager.java
index db6ed11..8e6220c 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ResourceManager.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ResourceManager.java
@@ -279,7 +279,7 @@
    */
   public synchronized boolean inUse() {
     return usedCpu != 0.0 || usedRam != 0.0 || usedIo != 0.0 || usedLocalTestCount != 0
-        || requestList.size() > 0;
+        || !requestList.isEmpty();
   }
 
 
@@ -374,7 +374,7 @@
     if (usedIo < epsilon) {
       usedIo = 0;
     }
-    if (requestList.size() > 0) {
+    if (!requestList.isEmpty()) {
       processWaitingThreads();
       return true;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Root.java b/src/main/java/com/google/devtools/build/lib/actions/Root.java
index 284b85f..55619eb 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/Root.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/Root.java
@@ -158,6 +158,6 @@
 
   @Override
   public String toString() {
-    return path.toString() + (isSourceRoot() ? "[source]" : "[derived]");
+    return path + (isSourceRoot() ? "[source]" : "[derived]");
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCache.java b/src/main/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCache.java
index 24eb42e..a4406d7 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCache.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCache.java
@@ -288,7 +288,7 @@
       try {
         content = decode(indexer, entry.getValue()).toString();
       } catch (IOException e) {
-        content = e.toString() + "\n";
+        content = e + "\n";
       }
       builder.append("-> ").append(indexer.getStringForIndex(entry.getKey())).append("\n")
           .append(content).append("  packed_len = ").append(entry.getValue().length).append("\n");
@@ -302,7 +302,7 @@
   @Override
   public synchronized void dump(PrintStream out) {
     out.println("String indexer content:\n");
-    out.println(indexer.toString());
+    out.println(indexer);
     out.println("Action cache (" + map.size() + " records):\n");
     for (Map.Entry<Integer, byte[]> entry: map.entrySet()) {
       if (entry.getKey() == VALIDATION_KEY) { continue; }
@@ -310,7 +310,7 @@
       try {
         content = CompactPersistentActionCache.decode(indexer, entry.getValue()).toString();
       } catch (IOException e) {
-        content = e.toString() + "\n";
+        content = e + "\n";
       }
       out.println(entry.getKey() + ", " + indexer.getStringForIndex(entry.getKey()) + ":\n"
           +  content + "\n      packed_len = " + entry.getValue().length + "\n");
diff --git a/src/main/java/com/google/devtools/build/lib/actions/cache/Digest.java b/src/main/java/com/google/devtools/build/lib/actions/cache/Digest.java
index f278507..5c9cc16 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/cache/Digest.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/cache/Digest.java
@@ -49,7 +49,7 @@
   @VisibleForTesting
   Digest(byte[] digest) {
     Preconditions.checkState(digest.length == MD5_SIZE);
-    this.digest = Arrays.copyOf(digest, digest.length);
+    this.digest = digest.clone();
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AbstractConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/AbstractConfiguredTarget.java
index e574978..0650a12 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AbstractConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AbstractConfiguredTarget.java
@@ -106,6 +106,6 @@
 
   @Override
   public ImmutableCollection<String> getKeys() {
-    return ImmutableList.<String>builder().add("label").add("files").build();
+    return ImmutableList.of("label", "files");
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
index 2e4c251..37f06c3 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
@@ -137,10 +137,10 @@
    */
   public static <T extends TransitiveInfoProvider> void checkProvider(Class<T> clazz) {
     if (!clazz.isInterface()) {
-      Preconditions.checkArgument(Modifier.isFinal(clazz.getModifiers()),
-          clazz.getName() + " has to be final");
+      Preconditions.checkArgument(
+          Modifier.isFinal(clazz.getModifiers()), "%s has to be final", clazz.getName());
       Preconditions.checkArgument(clazz.isAnnotationPresent(Immutable.class),
-          clazz.getName() + " has to be tagged with @Immutable");
+          "%s has to be tagged with @Immutable", clazz.getName());
     }
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
index a84bb94..5bf199d 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
@@ -420,13 +420,8 @@
         try {
           ConfiguredTarget ct = getConfiguredTarget(label, ctg.getConfiguration());
           keys.add(Preconditions.checkNotNull(ct.getProvider(ConfigMatchingProvider.class)));
-        } catch (NoSuchPackageException e) {
-          // All lookups should succeed because we should not be looking up any targets in error.
-          throw new IllegalStateException(e);
-        } catch (NoSuchTargetException e) {
-          // All lookups should succeed because we should not be looking up any targets in error.
-          throw new IllegalStateException(e);
-        } catch (NoSuchConfiguredTargetException e) {
+        } catch (
+            NoSuchPackageException | NoSuchTargetException | NoSuchConfiguredTargetException e) {
           // All lookups should succeed because we should not be looking up any targets in error.
           throw new IllegalStateException(e);
         }
@@ -781,7 +776,7 @@
     for (ExtraArtifactSet set : builder.build()) {
       boolean filterMatches = filter == null || filter.isIncluded(set.getLabel().toString());
       if (filterMatches) {
-        Iterables.addAll(artifactsToBuild, set.getArtifacts());
+        artifactsToBuild.addAll(set.getArtifacts());
       }
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java b/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
index bc45ba3..921e4e7 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
@@ -247,9 +247,7 @@
   public void registerAction(Action... actions) {
     Preconditions.checkState(enabled);
     if (allowRegisteringActions) {
-      for (Action action : actions) {
-        this.actions.add(action);
-      }
+      Collections.addAll(this.actions, actions);
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/CommandHelper.java b/src/main/java/com/google/devtools/build/lib/analysis/CommandHelper.java
index 416d92e..abc9c22 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/CommandHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/CommandHelper.java
@@ -122,7 +122,7 @@
         }
       } else {
         // Map all depArtifacts to the respective label using the multimaps.
-        Iterables.addAll(mapGet(tempLabelMap, label), files);
+        mapGet(tempLabelMap, label).addAll(files);
       }
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
index d265533..92687d6 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
@@ -255,7 +255,7 @@
       names.add(fragment.getSimpleName());
     }
     result.append("all of [");
-    result.append(Joiner.on(",").join(names));
+    Joiner.on(",").appendTo(result, names);
     result.append("], but these were all disabled");
     return result.toString();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
index 64cddb1..b7bd55e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
@@ -148,7 +148,7 @@
       Preconditions.checkNotNull(config);
       visitTargetVisibility(node, outgoingEdges.get(null));
       Rule rule = ((OutputFile) target).getGeneratingRule();
-      outgoingEdges.get(null).add(new Dependency(rule.getLabel(), config));
+      outgoingEdges.put(null, new Dependency(rule.getLabel(), config));
     } else if (target instanceof InputFile) {
       visitTargetVisibility(node, outgoingEdges.get(null));
     } else if (target instanceof EnvironmentGroup) {
@@ -508,8 +508,9 @@
         Iterable<BuildConfiguration> toConfigurations = config.evaluateTransition(
             rule, attribute, toTarget);
         for (BuildConfiguration toConfiguration : toConfigurations) {
-          outgoingEdges.get(entry.getKey()).add(new Dependency(
-              label, toConfiguration, requiredAspects(aspect, attribute, toTarget)));
+          outgoingEdges.put(
+              entry.getKey(),
+              new Dependency(label, toConfiguration, requiredAspects(aspect, attribute, toTarget)));
         }
       }
     }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/LocationExpander.java b/src/main/java/com/google/devtools/build/lib/analysis/LocationExpander.java
index 8feb28e..ae70699 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/LocationExpander.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/LocationExpander.java
@@ -110,7 +110,7 @@
       }
 
       if (attrValue.charAt(start + scannedLength) != ' ') {
-        result.append(attrValue.substring(restart, start + scannedLength));
+        result.append(attrValue, restart, start + scannedLength);
         restart = start + scannedLength;
         continue;
       }
@@ -149,7 +149,7 @@
         return attrValue;
       }
 
-      result.append(attrValue.substring(restart, start));
+      result.append(attrValue, restart, start);
       if (multiple) {
         Collections.sort(paths);
         Joiner.on(' ').appendTo(result, paths);
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/PrerequisiteArtifacts.java b/src/main/java/com/google/devtools/build/lib/analysis/PrerequisiteArtifacts.java
index 60c78d5..7594f4b 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/PrerequisiteArtifacts.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/PrerequisiteArtifacts.java
@@ -71,7 +71,7 @@
   }
 
   private PrerequisiteArtifacts filter(Predicate<String> fileType, boolean errorsForNonMatching) {
-    ImmutableList.Builder<Artifact> filtered = new ImmutableList.Builder<Artifact>();
+    ImmutableList.Builder<Artifact> filtered = new ImmutableList.Builder<>();
 
     for (Artifact artifact : artifacts) {
       if (fileType.apply(artifact.getFilename())) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index 1bbcd72..eef371b 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -1313,8 +1313,7 @@
             boolean allowedWithWarning = attribute.getAllowedRuleClassesWarningPredicate()
                 .apply(ruleClass);
             reportBadPrerequisite(attribute, prerequisiteTarget.getTargetKind(), prerequisiteLabel,
-                "expected " + attribute.getAllowedRuleClassesPredicate().toString(),
-                allowedWithWarning);
+                "expected " + attribute.getAllowedRuleClassesPredicate(), allowedWithWarning);
           }
         } else if (prerequisiteTarget instanceof FileTarget) {
           if (!attribute.getAllowedFileTypesPredicate()
@@ -1335,7 +1334,7 @@
             } else {
               // The file exists but has a bad extension
               reportBadPrerequisite(attribute, "file", prerequisiteLabel,
-                  "expected " + attribute.getAllowedFileTypesPredicate().toString(), false);
+                  "expected " + attribute.getAllowedFileTypesPredicate(), false);
             }
           }
         }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java b/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java
index aa7f429..a790e72 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java
@@ -108,7 +108,7 @@
     Preconditions.checkState(!runfiles.isEmpty());
 
     Map<PathFragment, Artifact> symlinks = getRunfilesSymlinks();
-    if (executable != null && !symlinks.values().contains(executable)) {
+    if (executable != null && !symlinks.containsValue(executable)) {
       throw new IllegalStateException("main program " + executable + " not included in runfiles");
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/WorkspaceStatusAction.java b/src/main/java/com/google/devtools/build/lib/analysis/WorkspaceStatusAction.java
index 5b3bd27..986b085 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/WorkspaceStatusAction.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/WorkspaceStatusAction.java
@@ -16,7 +16,6 @@
 
 import com.google.common.base.Splitter;
 import com.google.common.base.Supplier;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.actions.AbstractAction;
 import com.google.devtools.build.lib.actions.ActionOwner;
@@ -130,10 +129,10 @@
    */
   public static Map<String, String> parseValues(Path file) throws IOException {
     HashMap<String, String> result = new HashMap<>();
-    Splitter lineSplitter = Splitter.on(" ").limit(2);
-    for (String line : Splitter.on("\n").split(
-        new String(FileSystemUtils.readContentAsLatin1(file)))) {
-      List<String> items = ImmutableList.copyOf(lineSplitter.split(line));
+    Splitter lineSplitter = Splitter.on(' ').limit(2);
+    for (String line :
+        Splitter.on('\n').split(new String(FileSystemUtils.readContentAsLatin1(file)))) {
+      List<String> items = lineSplitter.splitToList(line);
       if (items.size() != 2) {
         continue;
       }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java
index daac95e..724b1a7 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java
@@ -54,7 +54,7 @@
 
 import java.nio.charset.Charset;
 import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -688,9 +688,7 @@
       this.executableArgs = Lists.newArrayList();
       executableArgs.add("-Xverify:none");
       executableArgs.addAll(jvmArgs);
-      for (String arg : launchArgs) {
-        executableArgs.add(arg);
-      }
+      Collections.addAll(executableArgs, launchArgs);
       inputsBuilder.add(deployJar);
       this.isShellCommand = false;
       return this;
@@ -774,7 +772,7 @@
      */
     public Builder addExecutableArguments(String... arguments) {
       Preconditions.checkState(executableArgs != null);
-      executableArgs.addAll(Arrays.asList(arguments));
+      Collections.addAll(executableArgs, arguments);
       return this;
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
index 5fac33d..967074a 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
@@ -18,7 +18,6 @@
 import com.google.common.base.Function;
 import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
-import com.google.common.base.Predicates;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -1074,12 +1073,12 @@
   private String buildMnemonic() {
     // See explanation at getShortName().
     String platformSuffix = (options.platformSuffix != null) ? options.platformSuffix : "";
-    ArrayList<String> nameParts = new ArrayList<String>();
+    ArrayList<String> nameParts = new ArrayList<>();
     for (Fragment fragment : fragments.values()) {
       nameParts.add(fragment.getOutputDirectoryName());
     }
     nameParts.add(getCompilationMode() + platformSuffix);
-    return Joiner.on('-').join(Iterables.filter(nameParts, Predicates.notNull()));
+    return Joiner.on('-').skipNulls().join(nameParts);
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java
index afe408f..8b44f654 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java
@@ -174,7 +174,7 @@
   public String toString() {
     StringBuilder stringBuilder = new StringBuilder();
     for (FragmentOptions options : fragmentOptionsMap.values()) {
-      stringBuilder.append(options.toString());
+      stringBuilder.append(options);
     }
     return stringBuilder.toString();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/DefaultsPackage.java b/src/main/java/com/google/devtools/build/lib/analysis/config/DefaultsPackage.java
index 207d49a..7d92bce 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/DefaultsPackage.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/DefaultsPackage.java
@@ -99,7 +99,7 @@
   }
 
   private String labelsToString(Set<Label> labels) {
-    StringBuffer result = new StringBuffer();
+    StringBuilder result = new StringBuilder();
     for (Label label : labels) {
       if (result.length() != 0) {
         result.append(", ");
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/PerLabelOptions.java b/src/main/java/com/google/devtools/build/lib/analysis/config/PerLabelOptions.java
index 1e921e5..66da6736 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/PerLabelOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/PerLabelOptions.java
@@ -61,7 +61,7 @@
         String optionsPiece = input.substring(atIndex + 1);
         List<String> optionsList = new ArrayList<>();
         for (String option : optionsPiece.split("(?<!\\\\),")) { // Split on ',' but not on '\,'
-          if (option != null && !option.trim().equals("")) {
+          if (option != null && !option.trim().isEmpty()) {
             optionsList.add(option.replace("\\,", ","));
           }
         }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/RunUnderConverter.java b/src/main/java/com/google/devtools/build/lib/analysis/config/RunUnderConverter.java
index 1f7b660..8da1fbb 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/RunUnderConverter.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/RunUnderConverter.java
@@ -60,7 +60,7 @@
     public RunUnderLabel(String input, Label runUnderLabel, List<String> runUnderList) {
       this.input = input;
       this.runUnderLabel = runUnderLabel;
-      this.runUnderList = new ArrayList<String>(runUnderList.subList(1, runUnderList.size()));
+      this.runUnderList = new ArrayList<>(runUnderList.subList(1, runUnderList.size()));
     }
 
     @Override public String getValue() { return input; }
@@ -97,7 +97,7 @@
     public RunUnderCommand(String input, String runUnderCommand, List<String> runUnderList) {
       this.input = input;
       this.runUnderCommand = runUnderCommand;
-      this.runUnderList = new ArrayList<String>(runUnderList.subList(1, runUnderList.size()));
+      this.runUnderList = new ArrayList<>(runUnderList.subList(1, runUnderList.size()));
     }
 
     @Override public String getValue() { return input; }
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryFunction.java
index 906c38b..632aa0d 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryFunction.java
@@ -130,7 +130,7 @@
           Transience.PERSISTENT);
     }
     Preconditions.checkState(ruleClassName == null || rule.getRuleClass().equals(ruleClassName),
-        "Got " + rule + ", was expecting a " + ruleClassName);
+        "Got %s, was expecting a %s", rule, ruleClassName);
     return rule;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaBuildInfoFactory.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaBuildInfoFactory.java
index db33897..8454e5c 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaBuildInfoFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaBuildInfoFactory.java
@@ -32,9 +32,7 @@
       .put("build.timestamp", "%BUILD_TIMESTAMP%")
       .build();
 
-  private static final Map<String, String> NONVOLATILE_KEYS = ImmutableMap
-      .<String, String>builder()
-      .build();
+  private static final Map<String, String> NONVOLATILE_KEYS = ImmutableMap.of();
 
   private static final Map<String, String> REDACTED_KEYS = ImmutableMap
       .<String, String>builder()
diff --git a/src/main/java/com/google/devtools/build/lib/collect/nestedset/Order.java b/src/main/java/com/google/devtools/build/lib/collect/nestedset/Order.java
index 38e6633..ec020b0 100644
--- a/src/main/java/com/google/devtools/build/lib/collect/nestedset/Order.java
+++ b/src/main/java/com/google/devtools/build/lib/collect/nestedset/Order.java
@@ -30,7 +30,7 @@
   private Order(NestedSetExpander<?> expander, NestedSetFactory factory) {
     this.expander = expander;
     this.factory = factory;
-    this.emptySet = new EmptyNestedSet<Object>(this);
+    this.emptySet = new EmptyNestedSet<>(this);
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/graph/CollectingVisitor.java b/src/main/java/com/google/devtools/build/lib/graph/CollectingVisitor.java
index caeb07b..88311ec 100644
--- a/src/main/java/com/google/devtools/build/lib/graph/CollectingVisitor.java
+++ b/src/main/java/com/google/devtools/build/lib/graph/CollectingVisitor.java
@@ -22,8 +22,7 @@
  *  they were visited, and allows them to be accessed as a list.
  */
 public class CollectingVisitor<T> extends AbstractGraphVisitor<T> {
-
-  private final List<Node<T>> order = new ArrayList<Node<T>>();
+  private final List<Node<T>> order = new ArrayList<>();
 
   @Override
   public void visitNode(Node<T> node) {
diff --git a/src/main/java/com/google/devtools/build/lib/graph/DFS.java b/src/main/java/com/google/devtools/build/lib/graph/DFS.java
index 37cd30e..66d1073 100644
--- a/src/main/java/com/google/devtools/build/lib/graph/DFS.java
+++ b/src/main/java/com/google/devtools/build/lib/graph/DFS.java
@@ -51,7 +51,7 @@
 
   private final boolean transpose;
 
-  private final Set<Node<T>> marked = new HashSet<Node<T>>();
+  private final Set<Node<T>> marked = new HashSet<>();
 
   /**
    *  Constructs a DFS instance for searching over the enclosing Digraph
diff --git a/src/main/java/com/google/devtools/build/lib/graph/Digraph.java b/src/main/java/com/google/devtools/build/lib/graph/Digraph.java
index 92e973a..b1ff09a 100644
--- a/src/main/java/com/google/devtools/build/lib/graph/Digraph.java
+++ b/src/main/java/com/google/devtools/build/lib/graph/Digraph.java
@@ -289,7 +289,7 @@
    * any "root".
    */
   public Set<Node<T>> getRoots() {
-    Set<Node<T>> roots = new HashSet<Node<T>>();
+    Set<Node<T>> roots = new HashSet<>();
     for (Node<T> node: nodes.values()) {
       if (!node.hasPredecessors()) {
         roots.add(node);
@@ -302,7 +302,7 @@
    * @return the set of leaf nodes: those with no successors.
    */
   public Set<Node<T>> getLeaves() {
-    Set<Node<T>> leaves = new HashSet<Node<T>>();
+    Set<Node<T>> leaves = new HashSet<>();
     for (Node<T> node: nodes.values()) {
       if (!node.hasSuccessors()) {
         leaves.add(node);
@@ -407,8 +407,7 @@
     final Object WHITE = null; // i.e. not present in nodeToColor, the default.
     final Object GREY  = new Object();
     final Object BLACK = new Object();
-    final Map<Node<T>, Object> nodeToColor =
-      new HashMap<Node<T>, Object>(); // empty => all white
+    final Map<Node<T>, Object> nodeToColor = new HashMap<>(); // empty => all white
 
     class CycleDetector { /* defining a class gives us lexical scope */
       boolean visit(Node<T> node) {
@@ -459,7 +458,7 @@
    * one strongly-connected component of the graph.
    */
   public Collection<Set<Node<T>>> getStronglyConnectedComponents() {
-    final List<Set<Node<T>>> sccs = new ArrayList<Set<Node<T>>>();
+    final List<Set<Node<T>>> sccs = new ArrayList<>();
     NodeSetReceiver<T> r = new NodeSetReceiver<T>() {
       @Override
       public void accept(Set<Node<T>> scc) {
@@ -491,8 +490,7 @@
     createImageUnderPartition(Collection<Set<Node<T>>> partition) {
 
     // Build mapping function: each node label is mapped to its equiv class:
-    Map<T, Set<Node<T>>> labelToImage =
-      new HashMap<T, Set<Node<T>>>();
+    Map<T, Set<Node<T>>> labelToImage = new HashMap<>();
     for (Set<Node<T>> set: partition) {
       // It's important to use immutable sets of node labels when sets are keys
       // in a map; see ImmutableSet class for explanation.
@@ -516,8 +514,7 @@
    */
   public <IMAGE> Digraph<IMAGE>
     createImageUnderMapping(Map<T, IMAGE> map) {
-
-    Digraph<IMAGE> imageGraph = new Digraph<IMAGE>();
+    Digraph<IMAGE> imageGraph = new Digraph<>();
 
     for (Node<T> fromNode: nodes.values()) {
       T fromLabel = fromNode.getLabel();
@@ -568,16 +565,15 @@
       return Collections.singletonList(fromNode);
     }
 
-    Map<Node<T>, Node<T>> pathPredecessor =
-      new HashMap<Node<T>, Node<T>>();
+    Map<Node<T>, Node<T>> pathPredecessor = new HashMap<>();
 
-    Set<Node<T>> marked = new HashSet<Node<T>>();
+    Set<Node<T>> marked = new HashSet<>();
 
-    LinkedList<Node<T>> queue = new LinkedList<Node<T>>();
+    LinkedList<Node<T>> queue = new LinkedList<>();
     queue.addLast(fromNode);
     marked.add(fromNode);
 
-    while (queue.size() > 0) {
+    while (!queue.isEmpty()) {
       Node<T> u = queue.removeFirst();
       for (Node<T> v: u.getSuccessors()) {
         if (marked.add(v)) {
@@ -903,13 +899,16 @@
    */
   private class SccVisitor<T> {
     // Nodes already assigned to a strongly connected component.
-    private final Set<Node<T>> assigned = new HashSet<Node<T>>();
+    private final Set<Node<T>> assigned = new HashSet<>();
+
     // The order each node was visited in.
-    private final Map<Node<T>, Integer> preorder = new HashMap<Node<T>, Integer>();
+    private final Map<Node<T>, Integer> preorder = new HashMap<>();
+
     // Stack of all nodes visited whose SCC has not yet been determined. When an SCC is found,
     // that SCC is an initial segment of this stack, and is popped off. Every time a new node is
     // visited, it is put on this stack.
-    private final List<Node<T>> stack = new ArrayList<Node<T>>();
+    private final List<Node<T>> stack = new ArrayList<>();
+
     // Stack of visited indices for the first-visited nodes in each of their known-so-far
     // strongly connected components. A node pushes its index on when it is visited. If any of
     // its successors have already been visited and are not in an already-found strongly connected
@@ -922,7 +921,8 @@
     // still the current node's index, then it was the first element visited of the current strongly
     // connected component. So all nodes on {@code stack} down to the current node are in its
     // strongly connected component. And the node's index is popped from preorderStack.
-    private final List<Integer> preorderStack = new ArrayList<Integer>();
+    private final List<Integer> preorderStack = new ArrayList<>();
+
     // Index of node being visited.
     private int counter = 0;
 
@@ -956,7 +956,7 @@
         // nodes that were part of a cycle with this node. So this node is the first-visited
         // element in its strongly connected component, and we collect the component.
         preorderStack.remove(preorderStack.size() - 1);
-        Set<Node<T>> scc = new HashSet<Node<T>>();
+        Set<Node<T>> scc = new HashSet<>();
         Node<T> compNode;
         do {
           compNode = stack.remove(stack.size() - 1);
diff --git a/src/main/java/com/google/devtools/build/lib/graph/Matrix.java b/src/main/java/com/google/devtools/build/lib/graph/Matrix.java
index 225d3d2..338fcac 100644
--- a/src/main/java/com/google/devtools/build/lib/graph/Matrix.java
+++ b/src/main/java/com/google/devtools/build/lib/graph/Matrix.java
@@ -41,7 +41,7 @@
   public Matrix(Set<T> labels) {
     this.N = labels.size();
     this.values = new ArrayList<T>(N);
-    this.indices = new HashMap<T, Integer>();
+    this.indices = new HashMap<>();
     this.m = new boolean[N][N];
 
     for (T label: labels) {
diff --git a/src/main/java/com/google/devtools/build/lib/graph/Node.java b/src/main/java/com/google/devtools/build/lib/graph/Node.java
index 9db2a4c..d271ca0 100644
--- a/src/main/java/com/google/devtools/build/lib/graph/Node.java
+++ b/src/main/java/com/google/devtools/build/lib/graph/Node.java
@@ -163,8 +163,7 @@
     int previousSize = set.size();
     if (previousSize == 1) {
       // SingletonList -> ArrayList
-      Collection<Node<T>> newSet =
-        new ArrayList<Node<T>>(ARRAYLIST_THRESHOLD);
+      Collection<Node<T>> newSet = new ArrayList<>(ARRAYLIST_THRESHOLD);
       newSet.addAll(set);
       newSet.add(value);
       return updateField(predecessorSet, newSet);
@@ -174,9 +173,8 @@
       return true;
   } else if (previousSize == ARRAYLIST_THRESHOLD) {
       // ArrayList -> HashSet
-      Collection<Node<T>> newSet =
-        new HashSet<Node<T>>(INITIAL_HASHSET_CAPACITY);
-      newSet.addAll(set);
+    Collection<Node<T>> newSet = new HashSet<>(INITIAL_HASHSET_CAPACITY);
+    newSet.addAll(set);
       newSet.add(value);
       return updateField(predecessorSet, newSet);
     } else {
@@ -219,8 +217,7 @@
 
       } else if (previousSize == 1 + ARRAYLIST_THRESHOLD) {
         // -> ArrayList
-        Collection<Node<T>> newSet =
-          new ArrayList<Node<T>>(ARRAYLIST_THRESHOLD);
+        Collection<Node<T>> newSet = new ArrayList<>(ARRAYLIST_THRESHOLD);
         newSet.addAll(set);
         return updateField(predecessorSet, newSet);
       }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AnalysisIssues.java b/src/main/java/com/google/devtools/build/lib/packages/AnalysisIssues.java
index 22c02b5..c0dda81 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AnalysisIssues.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AnalysisIssues.java
@@ -18,8 +18,8 @@
 import com.google.common.collect.ImmutableList;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 import javax.annotation.Nullable;
@@ -64,7 +64,7 @@
       } else {
         List<Object> args = new ArrayList<>();
         args.add(attribute);
-        args.addAll(Arrays.asList(arguments));
+        Collections.addAll(args, arguments);
         return String.format("ERROR in '%s': " + messageTemplate, args.toArray());
       }
     }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
index 9a8ae61..0616d79 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
@@ -287,8 +287,8 @@
     }
 
     private Builder<TYPE> setPropertyFlag(PropertyFlag flag, String propertyName) {
-      Preconditions.checkState(!propertyFlags.contains(flag),
-          propertyName + " flag is already set");
+      Preconditions.checkState(
+          !propertyFlags.contains(flag), "%s flag is already set", propertyName);
       propertyFlags.add(flag);
       return this;
     }
@@ -320,8 +320,7 @@
      * Only applicable for list type attributes.
      */
     public Builder<TYPE> nonEmpty() {
-      Preconditions.checkNotNull(type.getListElementType(),
-          "attribute '" + name + "' must be a list");
+      Preconditions.checkNotNull(type.getListElementType(), "attribute '%s' must be a list", name);
       return setPropertyFlag(PropertyFlag.NON_EMPTY, "non_empty");
     }
 
@@ -330,7 +329,7 @@
      */
     public Builder<TYPE> singleArtifact() {
       Preconditions.checkState((type == Type.LABEL) || (type == Type.LABEL_LIST),
-          "attribute '" + name + "' must be a label-valued type");
+          "attribute '%s' must be a label-valued type", name);
       return setPropertyFlag(PropertyFlag.SINGLE_ARTIFACT, "single_artifact");
     }
 
@@ -358,8 +357,7 @@
      * Mark the built attribute as order-independent.
      */
     public Builder<TYPE> orderIndependent() {
-      Preconditions.checkNotNull(type.getListElementType(),
-          "attribute '" + name + "' must be a list");
+      Preconditions.checkNotNull(type.getListElementType(), "attribute '%s' must be a list", name);
       return setPropertyFlag(PropertyFlag.ORDER_INDEPENDENT, "order-independent");
     }
 
@@ -468,7 +466,7 @@
      * Returns true if a late-bound value has been set. Useful only for Skylark.
      */
     public boolean hasLateBoundValue() {
-      return value != null && value instanceof LateBoundDefault;
+      return value instanceof LateBoundDefault;
     }
 
     /**
@@ -1024,9 +1022,10 @@
         || type == Type.LABEL || type == Type.LABEL_LIST
         || type == Type.NODEP_LABEL || type == Type.NODEP_LABEL_LIST,
         "Configuration transitions can only be specified for label or label list attributes");
-    Preconditions.checkArgument(isLateBound(name) == (defaultValue instanceof LateBoundDefault),
-        "late bound attributes require a default value that is late bound (and vice versa): "
-        + name);
+    Preconditions.checkArgument(
+        isLateBound(name) == (defaultValue instanceof LateBoundDefault),
+        "late bound attributes require a default value that is late bound (and vice versa): %s",
+        name);
     if (isLateBound(name)) {
       LateBoundDefault<?> lateBoundDefault = (LateBoundDefault<?>) defaultValue;
       Preconditions.checkArgument((configurator == null),
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AttributeContainer.java b/src/main/java/com/google/devtools/build/lib/packages/AttributeContainer.java
index be7584a..35248f2 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AttributeContainer.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AttributeContainer.java
@@ -78,7 +78,7 @@
 
   public boolean isAttributeValueExplicitlySpecified(String attributeName) {
     Integer idx = ruleClass.getAttributeIndex(attributeName);
-    return idx != null ? attributeValueExplicitlySpecified.get(idx) : false;
+    return idx != null && attributeValueExplicitlySpecified.get(idx);
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/packages/EnumFilterConverter.java b/src/main/java/com/google/devtools/build/lib/packages/EnumFilterConverter.java
index 31242e3..50ebae2 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/EnumFilterConverter.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/EnumFilterConverter.java
@@ -59,7 +59,7 @@
    */
   @Override
   public Set<E> convert(String input) throws OptionsParsingException {
-    if (input.equals("")) {
+    if (input.isEmpty()) {
       return Collections.emptySet();
     }
     EnumSet<E> includedSet = EnumSet.noneOf(typeClass);
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java b/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
index 9f72fd0..22aee8e6 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
@@ -361,7 +361,7 @@
       return formatBuilder.append(PERCENT_ESCAPER.escape(template)).toString();
     }
 
-    int end = template.indexOf("}", start + 2);
+    int end = template.indexOf('}', start + 2);
     if (end < 0) {
       return formatBuilder.append(PERCENT_ESCAPER.escape(template)).toString();
     }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/License.java b/src/main/java/com/google/devtools/build/lib/packages/License.java
index fe63c9c..f4e554e 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/License.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/License.java
@@ -124,7 +124,7 @@
       Set<DistributionType> result = EnumSet.noneOf(DistributionType.class);
       for (String distStr : distStrings) {
         try {
-          DistributionType dist = Enum.valueOf(DistributionType.class, distStr.toUpperCase());
+          DistributionType dist = DistributionType.valueOf(distStr.toUpperCase());
           result.add(dist);
         } catch (IllegalArgumentException e) {
           throw new LicenseParsingException("Invalid distribution type '" + distStr + "'");
@@ -300,7 +300,7 @@
     if (exceptions.isEmpty()) {
       return licenseTypes.toString().toLowerCase();
     } else {
-      return licenseTypes.toString().toLowerCase() + " with exceptions " + exceptions.toString();
+      return licenseTypes.toString().toLowerCase() + " with exceptions " + exceptions;
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/packages/MakeEnvironment.java b/src/main/java/com/google/devtools/build/lib/packages/MakeEnvironment.java
index 6c0d849..dea6602 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/MakeEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/MakeEnvironment.java
@@ -134,7 +134,7 @@
       }
       LinkedList<Binding> bindings = env.get(varname);
       if (bindings == null) {
-        bindings = new LinkedList<Binding>();
+        bindings = new LinkedList<>();
         env.put(varname, bindings);
       }
       // push new bindings onto head of list (=> most recent binding is
diff --git a/src/main/java/com/google/devtools/build/lib/packages/NoSuchTargetException.java b/src/main/java/com/google/devtools/build/lib/packages/NoSuchTargetException.java
index fa180fa..4e84824 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/NoSuchTargetException.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/NoSuchTargetException.java
@@ -48,7 +48,7 @@
     super(message, nspe);
     this.label = label;
     this.target = target;
-    this.packageLoadedSuccessfully = nspe != null ? false : true;
+    this.packageLoadedSuccessfully = nspe == null;
   }
 
   @Nullable
diff --git a/src/main/java/com/google/devtools/build/lib/packages/NonconfigurableAttributeMapper.java b/src/main/java/com/google/devtools/build/lib/packages/NonconfigurableAttributeMapper.java
index d54c847..03d778b 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/NonconfigurableAttributeMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/NonconfigurableAttributeMapper.java
@@ -44,7 +44,7 @@
   @Override
   public <T> T get(String attributeName, Type<T> type) {
     Preconditions.checkState(!getAttributeDefinition(attributeName).isConfigurable(),
-        "Attribute '" + attributeName + "' is potentially configurable - not allowed here");
+        "Attribute '%s' is potentially configurable - not allowed here", attributeName);
     return super.get(attributeName, type);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Package.java b/src/main/java/com/google/devtools/build/lib/packages/Package.java
index caf1578..186b9d9 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Package.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Package.java
@@ -1184,7 +1184,7 @@
     void setVisibilityAndLicense(InputFile inputFile, RuleVisibility visibility, License license) {
       String filename = inputFile.getName();
       Target cacheInstance = targets.get(filename);
-      if (cacheInstance == null || !(cacheInstance instanceof InputFile)) {
+      if (!(cacheInstance instanceof InputFile)) {
         throw new IllegalArgumentException("Can't set visibility for nonexistent FileTarget "
                                            + filename + " in package " + pkg.getName() + ".");
       }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java b/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
index 5eca0f4..cd407b6 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
@@ -73,8 +73,7 @@
         throws PackageDeserializationException {
       Object value = deserializeAttributeValue(expectedType, attrPb);
       return new ParsedAttributeValue(
-          attrPb.hasExplicitlySpecified() ? attrPb.getExplicitlySpecified() : false,
-          value,
+          attrPb.hasExplicitlySpecified() && attrPb.getExplicitlySpecified(), value,
           deserializeLocation(attrPb.getParseableLocation()));
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
index 0cfdf0a..fba3957 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
@@ -972,8 +972,8 @@
     String error = LabelValidator.validatePackageName(
         packageId.getPackageFragment().getPathString());
     if (error != null) {
-      throw new BuildFileNotFoundException(packageId.toString(),
-          "illegal package name: '" + packageId.toString() + "' (" + error + ")");
+      throw new BuildFileNotFoundException(
+          packageId.toString(), "illegal package name: '" + packageId + "' (" + error + ")");
     }
     ParserInputSource inputSource = maybeGetParserInputSource(buildFile, eventHandler);
     if (inputSource == null) {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageSpecification.java b/src/main/java/com/google/devtools/build/lib/packages/PackageSpecification.java
index 20524aa..cf7ff71 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageSpecification.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageSpecification.java
@@ -135,7 +135,7 @@
 
     @Override
     public String toString() {
-      return prefix.equals(new PathFragment("")) ? "..." : prefix.toString() + "/...";
+      return prefix.equals(new PathFragment("")) ? "..." : prefix + "/...";
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
index b7da520..23f1c97 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
@@ -240,7 +240,7 @@
         @Override
         public void checkName(String name) {
           Preconditions.checkArgument(
-              (name.contains("$") && !TargetUtils.isTestRuleName(name)) || name.equals(""));
+              (name.contains("$") && !TargetUtils.isTestRuleName(name)) || name.isEmpty());
         }
 
         @Override
@@ -274,8 +274,9 @@
       NORMAL {
         @Override
         public void checkName(String name) {
-          Preconditions.checkArgument(!TargetUtils.isTestRuleName(name)
-              && RULE_NAME_PATTERN.matcher(name).matches(), "Invalid rule name: " + name);
+          Preconditions.checkArgument(
+              !TargetUtils.isTestRuleName(name) && RULE_NAME_PATTERN.matcher(name).matches(),
+              "Invalid rule name: %s", name);
         }
 
         @Override
diff --git a/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java b/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java
index 3710eeb..fb0cee9 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java
@@ -191,7 +191,7 @@
    * <p>In practice this is the part before the "_", if any, otherwise the entire rule class name.
    */
   public static String getRuleLanguage(String ruleClass) {
-    int index = ruleClass.lastIndexOf("_");
+    int index = ruleClass.lastIndexOf('_');
     // Chop off "_binary" or "_test".
     return index != -1 ? ruleClass.substring(0, index) : ruleClass;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/SrcTargetUtil.java b/src/main/java/com/google/devtools/build/lib/pkgcache/SrcTargetUtil.java
index 85d967e..89969f6 100644
--- a/src/main/java/com/google/devtools/build/lib/pkgcache/SrcTargetUtil.java
+++ b/src/main/java/com/google/devtools/build/lib/pkgcache/SrcTargetUtil.java
@@ -94,9 +94,7 @@
   public static List<FileTarget> getHdrTargets(EventHandler eventHandler, Rule rule,
                                                      TargetProvider provider)
       throws NoSuchTargetException, NoSuchPackageException, InterruptedException  {
-    ImmutableSet<String> srcAndHdrAttributes = ImmutableSet.<String>builder()
-        .addAll(HEADER_ATTRIBUTES)
-        .build();
+    ImmutableSet<String> srcAndHdrAttributes = ImmutableSet.copyOf(HEADER_ATTRIBUTES);
     return getTargets(eventHandler, rule, srcAndHdrAttributes, Sets.newHashSet(rule), provider);
   }
   
diff --git a/src/main/java/com/google/devtools/build/lib/profiler/ProfileInfo.java b/src/main/java/com/google/devtools/build/lib/profiler/ProfileInfo.java
index 4ce3a93..8bd57a8 100644
--- a/src/main/java/com/google/devtools/build/lib/profiler/ProfileInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/profiler/ProfileInfo.java
@@ -92,7 +92,7 @@
           VarInt.putVarLong(stats[i].totalTime, sink);
         }
       }
-      content = sink.position() > 0 ? Arrays.copyOfRange(sink.array(), 0, sink.position()) : null;
+      content = sink.position() > 0 ? Arrays.copyOf(sink.array(), sink.position()) : null;
     }
 
     boolean isEmpty() { return content == null; }
@@ -308,7 +308,9 @@
       // Created map usually will end up with thousands of entries, so we
       // preinitialize it to the 10000.
       Map<K, Task[]> taskMap = Maps.newHashMapWithExpectedSize(10000);
-      if (taskList.size() == 0) { return taskMap; }
+      if (taskList.isEmpty()) {
+        return taskMap;
+      }
       Task[] taskArray = taskList.toArray(new Task[taskList.size()]);
       Arrays.sort(taskArray, this);
       K key = getKey(taskArray[0]);
@@ -393,7 +395,7 @@
    * task statistic. This method is sufficient to initialize data for dumping.
    */
   public void calculateStats() {
-    if (allTasksById.size() == 0) {
+    if (allTasksById.isEmpty()) {
       return;
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/profiler/Profiler.java b/src/main/java/com/google/devtools/build/lib/profiler/Profiler.java
index d592848..60b9fa2 100644
--- a/src/main/java/com/google/devtools/build/lib/profiler/Profiler.java
+++ b/src/main/java/com/google/devtools/build/lib/profiler/Profiler.java
@@ -268,7 +268,7 @@
           "Current task stack for thread " + Thread.currentThread().getName() + ":\n");
       List<TaskData> list = get();
       for (int i = list.size() - 1; i >= 0; i--) {
-        builder.append(list.get(i).toString());
+        builder.append(list.get(i));
         builder.append("\n");
       }
       return builder.toString();
@@ -337,7 +337,7 @@
       this.size = size;
 
       for (int i = 0; i < SHARDS; i++) {
-          priorityQueues[i] = new PriorityQueue<SlowTask>(size + 1);
+        priorityQueues[i] = new PriorityQueue<>(size + 1);
       }
     }
 
@@ -692,7 +692,7 @@
    */
   private void logTask(long startTime, long duration, ProfilerTask type, Object object) {
     Preconditions.checkNotNull(object);
-    Preconditions.checkState(startTime > 0, "startTime was " + startTime);
+    Preconditions.checkState(startTime > 0, "startTime was %s", startTime);
     if (duration < 0) {
       // See note in Clock#nanoTime, which is used by Profiler#nanoTimeMaybe.
       duration = 0;
diff --git a/src/main/java/com/google/devtools/build/lib/query2/LabelVisitor.java b/src/main/java/com/google/devtools/build/lib/query2/LabelVisitor.java
index b72e3aa..15534e6 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/LabelVisitor.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/LabelVisitor.java
@@ -281,9 +281,7 @@
       this.maxDepth = maxDepth;
       this.errorObserver = new TargetEdgeErrorObserver();
       ImmutableList.Builder<TargetEdgeObserver> builder = ImmutableList.builder();
-      for (TargetEdgeObserver observer : observers) {
-        builder.add(observer);
-      }
+      builder.add(observers);
       builder.add(errorObserver);
       this.observers = builder.build();
       this.keepGoing = keepGoing;
diff --git a/src/main/java/com/google/devtools/build/lib/query2/output/GraphOutputFormatter.java b/src/main/java/com/google/devtools/build/lib/query2/output/GraphOutputFormatter.java
index 5ded5e2..c51fc81 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/output/GraphOutputFormatter.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/output/GraphOutputFormatter.java
@@ -91,7 +91,7 @@
       public String serialize(Node<Set<Node<Target>>> node) {
         int actualLimit = graphNodeStringLimit - RESERVED_LABEL_CHARS;
         boolean firstItem = true;
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         int count = 0;
         for (Node<Target> eqNode : node.getLabel()) {
           String labelString = eqNode.getLabel().getLabel().toString();
diff --git a/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java b/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java
index e7cd908..7ce4c94 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java
@@ -284,9 +284,9 @@
     }
 
     private void outputRule(Rule rule, PrintStream out) {
-      out.println(String.format("# %s", rule.getLocation()));
-      out.println(String.format("%s(", rule.getRuleClass()));
-      out.println(String.format("  name = \"%s\",", rule.getName()));
+      out.printf("# %s%n", rule.getLocation());
+      out.printf("%s(%n", rule.getRuleClass());
+      out.printf("  name = \"%s\",%n", rule.getName());
 
       for (Attribute attr : rule.getAttributes()) {
         Pair<Iterable<Object>, AttributeValueSource> values = getAttributeValues(rule, attr);
@@ -297,7 +297,7 @@
           continue;  // Don't print default values.
         }
         Object value = Iterables.getOnlyElement(values.first);
-        out.print(String.format("  %s = ", attr.getName()));
+        out.printf("  %s = ", attr.getName());
         if (value instanceof Label) {
           value = value.toString();
         } else if (value instanceof List<?> && EvalUtils.isImmutable(value)) {
@@ -307,7 +307,7 @@
         EvalUtils.prettyPrintValue(value, out);
         out.println(",");
       }
-      out.println(String.format(")\n"));
+      out.printf(")\n%n");
     }
 
     @Override
diff --git a/src/main/java/com/google/devtools/build/lib/query2/output/XmlOutputFormatter.java b/src/main/java/com/google/devtools/build/lib/query2/output/XmlOutputFormatter.java
index c01c90e4..287ad0b 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/output/XmlOutputFormatter.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/output/XmlOutputFormatter.java
@@ -184,7 +184,7 @@
     elem.setAttribute("name", target.getLabel().toString());
     String location = target.getLocation().print();
     if (!xmlLineNumbers) {
-      int firstColon = location.indexOf(":");
+      int firstColon = location.indexOf(':');
       if (firstColon != -1) {
         location = location.substring(0, firstColon);
       }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java
index 885fe8a..c2034ab 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java
@@ -387,7 +387,7 @@
 
   @SkylarkCallable(doc = "Splits a shell command to a list of tokens.", hidden = true)
   public List<String> tokenize(String optionString) throws FuncallException {
-    List<String> options = new ArrayList<String>();
+    List<String> options = new ArrayList<>();
     try {
       ShellUtils.tokenize(options, optionString);
     } catch (TokenizationException e) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
index fa74a3a..5086471 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
@@ -317,9 +317,9 @@
       }
     } else {
       if (!linkstaticAttribute && appearsToHaveNoObjectFiles(ruleContext.attributes())) {
-        Artifact element = ccCompilationOutputs.getObjectFiles(false).isEmpty()
-            ? ccCompilationOutputs.getObjectFiles(true).get(0)
-            : ccCompilationOutputs.getObjectFiles(false).get(0);
+        Artifact element = Iterables.getFirst(
+            ccCompilationOutputs.getObjectFiles(false),
+            ccCompilationOutputs.getObjectFiles(true).get(0));
         ruleContext.attributeWarning("srcs",
              "this library appears at first glance to have no object files, "
              + "but on closer inspection it does have something to link, e.g. "
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java
index a32d771..25d01b9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java
@@ -33,6 +33,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -839,12 +840,7 @@
      * @return whether a currently enabled feature implies the given feature.
      */
     private boolean isImpliedByEnabledFeature(Feature feature) {
-      for (Feature implies : impliedBy.get(feature)) {
-        if (enabled.contains(implies)) {
-          return true;
-        }
-      }
-      return false;
+      return !Collections.disjoint(impliedBy.get(feature), enabled);
     }
         
     /**
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeParser.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeParser.java
index 0b60b45..a164663 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeParser.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeParser.java
@@ -87,7 +87,7 @@
      *         are provided
      */
     public Rule(String type, String pattern, String findRoot, String findFilter) {
-      this(type, pattern, findRoot.replace("\\", "$"), Pattern.compile(findFilter));
+      this(type, pattern, findRoot.replace('\\', '$'), Pattern.compile(findFilter));
       Preconditions.checkArgument((this.type == Type.PATH) || (this.type == Type.FILE));
     }
 
@@ -365,7 +365,7 @@
 
     @Override
     public String toString() {
-      return kind.toString() + ":" + pathFragment.getPathString();
+      return kind + ":" + pathFragment.getPathString();
     }
 
     @Override
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScanner.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScanner.java
index 9c00efd..65d89b9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScanner.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScanner.java
@@ -105,9 +105,7 @@
           List<PathFragment> quoteIncludeDirs = scannable.getQuoteIncludeDirs();
           List<String> cmdlineIncludes = scannable.getCmdlineIncludes();
 
-          for (PathFragment pathFragment : scannable.getSystemIncludeDirs()) {
-            includeDirs.add(pathFragment);
-          }
+          includeDirs.addAll(scannable.getSystemIncludeDirs());
 
           // Add the system include paths to the list of include paths.
           for (PathFragment pathFragment : action.getBuiltInIncludeDirectories()) {
@@ -149,7 +147,6 @@
 
       // Collect inputs and output
       List<Artifact> inputs = new ArrayList<>();
-      IncludeProblems includeProblems = new IncludeProblems();
       for (Artifact included : includes) {
         if (FileSystemUtils.startsWithAny(included.getPath(), absoluteBuiltInIncludeDirs)) {
           // Skip include files found in absolute include directories. This currently only applies
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java
index 24120ce..63503ca 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java
@@ -83,7 +83,7 @@
 
     @Override
     public String toString() {
-      return "SimpleLinkerInput(" + artifact.toString() + ")";
+      return "SimpleLinkerInput(" + artifact + ")";
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/extra/ActionListener.java b/src/main/java/com/google/devtools/build/lib/rules/extra/ActionListener.java
index f3b302f..d653c9a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/extra/ActionListener.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/extra/ActionListener.java
@@ -76,7 +76,7 @@
         extraActions.add(spec);
       }
     }
-    if (extraActions.size() == 0) {
+    if (extraActions.isEmpty()) {
       ruleContext.attributeWarning("extra_actions",
           "No extra_action is specified for this version of blaze.");
     }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/extra/ExtraActionSpec.java b/src/main/java/com/google/devtools/build/lib/rules/extra/ExtraActionSpec.java
index 38e4a4b..8b52ccf 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/extra/ExtraActionSpec.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/extra/ExtraActionSpec.java
@@ -95,7 +95,7 @@
           owner, outputTemplate));
     }
     // extra_action has no output, we need to create some dummy output to keep the build up-to-date.
-    if (extraActionOutputs.size() == 0) {
+    if (extraActionOutputs.isEmpty()) {
       createDummyOutput = true;
       extraActionOutputs.add(getExtraActionOutputArtifact(owningRule, actionToShadow,
           owner, "$(ACTION_ID).dummy"));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/GenericBuildInfoPropertiesTranslator.java b/src/main/java/com/google/devtools/build/lib/rules/java/GenericBuildInfoPropertiesTranslator.java
index df6a325..edbe79b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/GenericBuildInfoPropertiesTranslator.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/GenericBuildInfoPropertiesTranslator.java
@@ -60,7 +60,7 @@
 
   private String translateValue(String valueDescription, Map<String, String> buildInfo) {
     String[] split = valueDescription.split("%");
-    StringBuffer result = new StringBuffer();
+    StringBuilder result = new StringBuilder();
     boolean isInsideKey = false;
     for (String key : split) {
       if (isInsideKey) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBuildInfoFactory.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBuildInfoFactory.java
index 442b85b..5a9239d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBuildInfoFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBuildInfoFactory.java
@@ -82,7 +82,7 @@
         createVolatileTranslator(),
         true,
         false);
-    List<Action> actions = new ArrayList<Action>(3);
+    List<Action> actions = new ArrayList<>(3);
     actions.add(redactedInfo);
     actions.add(nonvolatileInfo);
     actions.add(volatileInfo);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
index 006a5df..74627f3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
@@ -750,7 +750,7 @@
       // aggregation code below should go away.
       List<String> jcopts = new ArrayList<>(javacOpts);
       JavaConfiguration javaConfiguration = configuration.getFragment(JavaConfiguration.class);
-      if (javaConfiguration.getJavaWarns().size() > 0) {
+      if (!javaConfiguration.getJavaWarns().isEmpty()) {
         jcopts.add("-Xlint:" + Joiner.on(',').join(javaConfiguration.getJavaWarns()));
       }
       if (!bootclasspathEntries.isEmpty()) {
@@ -950,12 +950,12 @@
      * Accumulates the given jar artifacts as being provided by direct dependencies.
      */
     public Builder addDirectJars(Collection<Artifact> directJars) {
-      Iterables.addAll(this.directJars, directJars);
+      this.directJars.addAll(directJars);
       return this;
     }
 
     public Builder addCompileTimeDependencyArtifacts(Collection<Artifact> dependencyArtifacts) {
-      Iterables.addAll(this.compileTimeDependencyArtifacts, dependencyArtifacts);
+      this.compileTimeDependencyArtifacts.addAll(dependencyArtifacts);
       return this;
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesCollector.java b/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesCollector.java
index e62a3b8..2860751 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesCollector.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesCollector.java
@@ -15,7 +15,6 @@
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.actions.Action;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.AnalysisEnvironment;
@@ -203,7 +202,7 @@
     for (String attr : getSourceAttributes()) {
       if (ruleContext.getRule().isAttrDefined(attr, Type.LABEL_LIST) ||
           ruleContext.getRule().isAttrDefined(attr, Type.LABEL)) {
-        Iterables.addAll(prerequisites, ruleContext.getPrerequisites(attr, Mode.DONT_CHECK));
+        prerequisites.addAll(ruleContext.getPrerequisites(attr, Mode.DONT_CHECK));
       }
     }
     return prerequisites;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/TestLogHelper.java b/src/main/java/com/google/devtools/build/lib/rules/test/TestLogHelper.java
index 462c24c..4690af6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/test/TestLogHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/test/TestLogHelper.java
@@ -66,11 +66,8 @@
       ByteStreams.copy(input, filteringOutputStream);
 
       if (!filteringOutputStream.foundHeader()) {
-        InputStream inputAgain = testOutput.getInputStream();
-        try {
+        try (InputStream inputAgain = testOutput.getInputStream()) {
           ByteStreams.copy(inputAgain, out);
-        } finally {
-          inputAgain.close();
         }
       }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/TestStrategy.java b/src/main/java/com/google/devtools/build/lib/rules/test/TestStrategy.java
index 4905e15..103ba62 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/test/TestStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/test/TestStrategy.java
@@ -375,11 +375,8 @@
         Thread.currentThread().interrupt();
       }
       if (!headerFilter.foundHeader()) {
-        InputStream input = testLogPath.getInputStream();
-        try {
+        try (InputStream input = testLogPath.getInputStream()) {
           ByteStreams.copy(input, outErr.getOutputStream());
-        } finally {
-          input.close();
         }
       }
     }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/TestXmlOutputParser.java b/src/main/java/com/google/devtools/build/lib/rules/test/TestXmlOutputParser.java
index 8d660ec..b911004 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/test/TestXmlOutputParser.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/test/TestXmlOutputParser.java
@@ -230,24 +230,29 @@
           // they can be too big to fit in the memory. We add failure and error
           // elements to the output without a message, so that there is a
           // difference between passed and failed test cases.
-          if (childElementName.equals("testsuite")) {
-            builder.addChild(parseTestSuite(parser, childElementName));
-          } else if (childElementName.equals("testcase")) {
-            builder.addChild(parseTestCase(parser));
-          } else if (childElementName.equals("failure")) {
-            failures += 1;
-            skipCompleteElement(parser);
-          } else if (childElementName.equals("error")) {
-            errors += 1;
-            skipCompleteElement(parser);
-          } else if (childElementName.equals("testdecorator")) {
-            builder.addChild(parseTestDecorator(parser));
-          } else {
-
-            // Unknown element encountered. Since the schema of the input file
-            // is a bit hazy, just skip it and go merrily on our way. Ignorance
-            // is bliss.
-            skipCompleteElement(parser);
+          switch (childElementName) {
+            case "testsuite":
+              builder.addChild(parseTestSuite(parser, childElementName));
+              break;
+            case "testcase":
+              builder.addChild(parseTestCase(parser));
+              break;
+            case "failure":
+              failures += 1;
+              skipCompleteElement(parser);
+              break;
+            case "error":
+              errors += 1;
+              skipCompleteElement(parser);
+              break;
+            case "testdecorator":
+              builder.addChild(parseTestDecorator(parser));
+              break;
+            default:
+              // Unknown element encountered. Since the schema of the input file
+              // is a bit hazy, just skip it and go merrily on our way. Ignorance
+              // is bliss.
+              skipCompleteElement(parser);
           }
           break;
 
@@ -296,20 +301,28 @@
       String name = parser.getAttributeLocalName(i).intern();
       String value = parser.getAttributeValue(i);
 
-      if (name.equals("name")) {
-        builder.setName(value);
-      } else if (name.equals("classname")) {
-        builder.setClassName(value);
-      } else if (name.equals("time")) {
-        builder.setRunDurationMillis(parseTime(value));
-      } else if (name.equals("result")) {
-        builder.setResult(value);
-      } else if (name.equals("status")) {
-        if (value.equals("notrun")) {
-          builder.setRun(false);
-        } else if (value.equals("run")) {
-          builder.setRun(true);
-        }
+      switch (name) {
+        case "name":
+          builder.setName(value);
+          break;
+        case "classname":
+          builder.setClassName(value);
+          break;
+        case "time":
+          builder.setRunDurationMillis(parseTime(value));
+          break;
+        case "result":
+          builder.setResult(value);
+          break;
+        case "status":
+          if (value.equals("notrun")) {
+            builder.setRun(false);
+          } else if (value.equals("run")) {
+            builder.setRun(true);
+          }
+          break;
+        default:
+          // fall through
       }
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/FancyTerminalEventHandler.java b/src/main/java/com/google/devtools/build/lib/runtime/FancyTerminalEventHandler.java
index e55ad2f..9b9b48a 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/FancyTerminalEventHandler.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/FancyTerminalEventHandler.java
@@ -253,7 +253,7 @@
       terminal.textRed();
       terminal.textBold();
     }
-    terminal.writeString(event.getKind().toString() + ": ");
+    terminal.writeString(event.getKind() + ": ");
     if (useColor) {
       terminal.resetTerminal();
     }
@@ -281,7 +281,7 @@
     if (useColor) {
       terminal.textGreen();
     }
-    terminal.writeString(event.getKind().toString() + ": ");
+    terminal.writeString(event.getKind() + ": ");
     terminal.resetTerminal();
     writeTimestampAndLocation(event);
     terminal.writeString(event.getMessage());
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/TestSummary.java b/src/main/java/com/google/devtools/build/lib/runtime/TestSummary.java
index 75c7fe2..3e4405e 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/TestSummary.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/TestSummary.java
@@ -189,7 +189,7 @@
         allCases.put(detail.getClassName() + "." + detail.getName(), detail);
       }
 
-      summary.failedTestCases = new ArrayList<TestCase>(allCases.values());
+      summary.failedTestCases = new ArrayList<>(allCases.values());
       return this;
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/TestSummaryPrinter.java b/src/main/java/com/google/devtools/build/lib/runtime/TestSummaryPrinter.java
index 91c1488..7ddabbc 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/TestSummaryPrinter.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/TestSummaryPrinter.java
@@ -231,8 +231,8 @@
       double sumOfSquares = 0.0;
       for (Long l : summary.getTestTimes()) {
         long value = l.longValue();
-        min = value < min ? value : min;
-        max = value > max ? value : max;
+        min = Math.min(value, min);
+        max = Math.max(value, max);
         sum += value;
         sumOfSquares += ((double) value) * (double) value;
       }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
index 178872c..5be4f90 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/CleanCommand.java
@@ -89,8 +89,8 @@
     cleanOptions.expunge_async = cleanOptions.cleanStyle.equals("expunge_async");
     cleanOptions.expunge = cleanOptions.cleanStyle.equals("expunge");
 
-    if (cleanOptions.expunge == false && cleanOptions.expunge_async == false &&
-        !cleanOptions.cleanStyle.isEmpty()) {
+    if (!cleanOptions.expunge && !cleanOptions.expunge_async
+        && !cleanOptions.cleanStyle.isEmpty()) {
       runtime.getReporter().handle(Event.error(
           null, "Invalid clean_style value '" + cleanOptions.cleanStyle + "'"));
       return ExitCode.COMMAND_LINE_ERROR;
@@ -110,10 +110,7 @@
     } catch (IOException e) {
       runtime.getReporter().handle(Event.error(e.getMessage()));
       return ExitCode.LOCAL_ENVIRONMENTAL_ERROR;
-    } catch (CommandException e) {
-      runtime.getReporter().handle(Event.error(e.getMessage()));
-      return ExitCode.RUN_FAILURE;
-    } catch (ExecException e) {
+    } catch (CommandException | ExecException e) {
       runtime.getReporter().handle(Event.error(e.getMessage()));
       return ExitCode.RUN_FAILURE;
     } catch (InterruptedException e) {
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
index 6333c79..2d0e720 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
@@ -424,7 +424,7 @@
     }
     ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
     PrintWriter writer = new PrintWriter(outputStream);
-    writer.print(value.toString() + "\n");
+    writer.print(value + "\n");
     writer.flush();
     return outputStream.toByteArray();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/ProfileCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/ProfileCommand.java
index 7b91dc7..08cb072 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/ProfileCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/ProfileCommand.java
@@ -17,6 +17,7 @@
 import com.google.common.base.Functions;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Maps;
+import com.google.common.collect.Multimaps;
 import com.google.common.collect.Ordering;
 import com.google.common.collect.TreeMultimap;
 import com.google.devtools.build.lib.actions.MiddlemanAction;
@@ -54,6 +55,7 @@
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.EnumMap;
 import java.util.EnumSet;
 import java.util.List;
@@ -195,7 +197,7 @@
     for (ProfilePhaseStatistics stat : statistics) {
       String title = stat.getTitle();
 
-      if (!title.equals("")) {
+      if (!title.isEmpty()) {
         out.println("\n=== " + title.toUpperCase() + " ===\n");
       }
       out.print(stat.getStatistics());
@@ -350,8 +352,7 @@
   }
 
   private void printCriticalPath(String title, PrintStream out, CriticalPathEntry path) {
-    out.println(String.format("\n%s (%s):", title,
-        TimeUtilities.prettyTime(path.cumulativeDuration)));
+    out.printf("\n%s (%s):%n", title, TimeUtilities.prettyTime(path.cumulativeDuration));
 
     boolean lightCriticalPath = isLightCriticalPath(path);
     out.println(lightCriticalPath ?
@@ -376,29 +377,26 @@
       } else {
         String desc = path.task.getDescription().replace(':', ' ');
         if (lightCriticalPath) {
-          out.println(String.format("%6d %11s %8s   %s", path.task.id,
-              TimeUtilities.prettyTime(path.duration),
-              prettyPercentage(path.duration, totalPathTime),
-              desc));
+          out.printf("%6d %11s %8s   %s%n", path.task.id, TimeUtilities.prettyTime(path.duration),
+              prettyPercentage(path.duration, totalPathTime), desc);
         } else {
-          out.println(String.format("%6d %11s %8s %8s   %s", path.task.id,
+          out.printf("%6d %11s %8s %8s   %s%n", path.task.id,
               TimeUtilities.prettyTime(path.duration),
               prettyPercentage(path.duration, totalPathTime),
-              prettyPercentage(path.getCriticalTime(), totalPathTime), desc));
+              prettyPercentage(path.getCriticalTime(), totalPathTime), desc);
         }
       }
     }
     if (middlemanCount > 0) {
       if (lightCriticalPath) {
-        out.println(String.format("       %11s %8s   [%d middleman actions]",
+        out.printf("       %11s %8s   [%d middleman actions]%n",
             TimeUtilities.prettyTime(middlemanDuration),
-            prettyPercentage(middlemanDuration, totalPathTime),
-            middlemanCount));
+            prettyPercentage(middlemanDuration, totalPathTime), middlemanCount);
       } else {
-        out.println(String.format("       %11s %8s %8s   [%d middleman actions]",
+        out.printf("       %11s %8s %8s   [%d middleman actions]%n",
             TimeUtilities.prettyTime(middlemanDuration),
             prettyPercentage(middlemanDuration, totalPathTime),
-            prettyPercentage(middlemanCritTime, totalPathTime), middlemanCount));
+            prettyPercentage(middlemanCritTime, totalPathTime), middlemanCount);
       }
     }
   }
@@ -434,12 +432,12 @@
       if (stats.count > 0 && stats.totalTime > 0) {
         if (headerNeeded) {
           out.println("\nTotal time (across all threads) spent on:");
-          out.println(String.format("%18s %8s %8s %11s", "Type", "Total", "Count", "Average"));
+          out.printf("%18s %8s %8s %11s%n", "Type", "Total", "Count", "Average");
           headerNeeded = false;
         }
-        out.println(String.format("%18s %8s %8d %11s", type.toString(),
+        out.printf("%18s %8s %8d %11s%n", type.toString(),
             prettyPercentage(stats.totalTime, totalDuration), stats.count,
-            TimeUtilities.prettyTime(stats.totalTime / stats.count)));
+            TimeUtilities.prettyTime(stats.totalTime / stats.count));
       }
     }
   }
@@ -496,9 +494,7 @@
       TreeMultimap<Stat, String> sortedStats =
           TreeMultimap.create(Ordering.natural().reverse(), Ordering.natural());
 
-      for (Map.Entry<String, Stat> stat : statsForType.entrySet()) {
-        sortedStats.put(stat.getValue(), stat.getKey());
-      }
+      Multimaps.invertFrom(Multimaps.forMap(statsForType), sortedStats);
 
       int numPrinted = 0;
       for (Map.Entry<Stat, String> stat : sortedStats.entries()) {
@@ -548,9 +544,7 @@
    */
   private EnumSet<ProfilerTask> getTypeFilter(ProfilerTask... tasks) {
     EnumSet<ProfilerTask> filter = EnumSet.of(ProfilerTask.ACTION_LOCK, ProfilerTask.WAIT);
-    for (ProfilerTask task : tasks) {
-      filter.add(task);
-    }
+    Collections.addAll(filter, tasks);
     return filter;
   }
 
@@ -611,7 +605,7 @@
       out.printf(TWO_COLUMN_FORMAT, "Total time finalizing build",
           TimeUtilities.prettyTime(info.getPhaseDuration(finishPhase)));
     }
-    out.println("");
+    out.println();
     out.printf(TWO_COLUMN_FORMAT, "Action dependency map creation",
         TimeUtilities.prettyTime(graphTime));
     out.printf(TWO_COLUMN_FORMAT, "Actual execution time",
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/ProjectFileSupport.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/ProjectFileSupport.java
index 2e5faf6..bec0deb 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/ProjectFileSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/ProjectFileSupport.java
@@ -48,7 +48,7 @@
       String command) throws AbruptExitException {
     List<String> targets = optionsParser.getResidue();
     ProjectFile.Provider projectFileProvider = runtime.getProjectFileProvider();
-    if (projectFileProvider != null && targets.size() > 0
+    if (projectFileProvider != null && !targets.isEmpty()
         && targets.get(0).startsWith(PROJECT_FILE_PREFIX)) {
       if (targets.size() > 1) {
         throw new AbruptExitException("Cannot handle more than one +<file> argument yet",
@@ -84,7 +84,7 @@
    */
   public static List<String> getTargets(BlazeRuntime runtime, OptionsProvider options) {
     List<String> targets = options.getResidue();
-    if (runtime.getProjectFileProvider() != null && targets.size() > 0
+    if (runtime.getProjectFileProvider() != null && !targets.isEmpty()
         && targets.get(0).startsWith(PROJECT_FILE_PREFIX)) {
       return targets.subList(1, targets.size());
     }
diff --git a/src/main/java/com/google/devtools/build/lib/server/RPCService.java b/src/main/java/com/google/devtools/build/lib/server/RPCService.java
index 379e83c..3aa20d4 100644
--- a/src/main/java/com/google/devtools/build/lib/server/RPCService.java
+++ b/src/main/java/com/google/devtools/build/lib/server/RPCService.java
@@ -14,6 +14,7 @@
 
 package com.google.devtools.build.lib.server;
 
+import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.util.io.OutErr;
 
 import java.util.List;
@@ -59,7 +60,7 @@
     if (isShutdown) {
       throw new IllegalStateException("Received request after shutdown.");
     }
-    String command = request.isEmpty() ? "" : request.get(0);
+    String command = Iterables.getFirst(request, "");
     if (appCommand != null && command.equals("blaze")) { // an application request
       int result = appCommand.exec(request.subList(1, request.size()), outErr, firstContactTime);
       if (appCommand.shutdown()) { // an application shutdown request
diff --git a/src/main/java/com/google/devtools/build/lib/server/ServerResponse.java b/src/main/java/com/google/devtools/build/lib/server/ServerResponse.java
index e5ab930..f222564 100644
--- a/src/main/java/com/google/devtools/build/lib/server/ServerResponse.java
+++ b/src/main/java/com/google/devtools/build/lib/server/ServerResponse.java
@@ -95,12 +95,14 @@
     if (errorMessage.length() == 0) {
       return Integer.toString(exitStatus) + '\n';
     }
-    return errorMessage + '\n' + Integer.toString(exitStatus) + '\n';
+    return errorMessage + '\n' + exitStatus + '\n';
   }
 
   @Override
   public boolean equals(Object other) {
-    if (other == null || !(other instanceof ServerResponse)) return false;
+    if (!(other instanceof ServerResponse)) {
+      return false;
+    }
     ServerResponse otherResponse = (ServerResponse) other;
     return exitStatus == otherResponse.exitStatus
         && errorMessage.equals(otherResponse.errorMessage);
diff --git a/src/main/java/com/google/devtools/build/lib/shell/Command.java b/src/main/java/com/google/devtools/build/lib/shell/Command.java
index 70c5f8a..364373d 100644
--- a/src/main/java/com/google/devtools/build/lib/shell/Command.java
+++ b/src/main/java/com/google/devtools/build/lib/shell/Command.java
@@ -876,7 +876,7 @@
       message.append(']');
     }
     message.append("; environment: ");
-    message.append(processBuilder.environment().toString());
+    message.append(processBuilder.environment());
     final File workingDirectory = processBuilder.directory();
     message.append("; working dir: ");
     message.append(workingDirectory == null ?
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AbstractLabelCycleReporter.java b/src/main/java/com/google/devtools/build/lib/skyframe/AbstractLabelCycleReporter.java
index 797f158..444ae94 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/AbstractLabelCycleReporter.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/AbstractLabelCycleReporter.java
@@ -82,9 +82,9 @@
 
       Label label = getLabel(cycleValue);
       Target target = getTargetForLabel(label);
-      eventHandler.handle(
-          Event.error(target.getLocation(), "in " + target.getTargetKind() + " " + label
-              + ": " + cycleMessage.toString()));
+      eventHandler.handle(Event.error(
+          target.getLocation(),
+          "in " + target.getTargetKind() + " " + label + ": " + cycleMessage));
     }
 
     return true;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionArtifactCycleReporter.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionArtifactCycleReporter.java
index 3105539..022e63f 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionArtifactCycleReporter.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionArtifactCycleReporter.java
@@ -52,7 +52,7 @@
       return "action: " + ((Action) arg).getMnemonic();
     } else if (arg instanceof LabelAndConfiguration
         && skyFunctionName == SkyFunctions.TARGET_COMPLETION) {
-      return "configured target: " + ((LabelAndConfiguration) arg).getLabel().toString();
+      return "configured target: " + ((LabelAndConfiguration) arg).getLabel();
     }
     throw new IllegalStateException(
         "Argument is not Action, TargetCompletion,  or OwnedArtifact: " + arg);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java
index ea744c1..88d1e61 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java
@@ -85,7 +85,7 @@
       return "null";
     }
     return (configuration != null && configuration.isHostConfiguration())
-        ? (label.toString() + " (host)") : label.toString();
+        ? (label + " (host)") : label.toString();
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunction.java
index 58cb67d..1c5ec09 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunction.java
@@ -29,8 +29,8 @@
   @Override
   public SkyValue compute(SkyKey skyKey, Environment env) {
     PackageIdentifier dir = (PackageIdentifier) skyKey.argument();
-    PackageLookupValue pkgLookupValue = null;
-    pkgLookupValue = (PackageLookupValue) env.getValue(PackageLookupValue.key(dir));
+    PackageLookupValue pkgLookupValue =
+        (PackageLookupValue) env.getValue(PackageLookupValue.key(dir));
     if (pkgLookupValue == null) {
       return null;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunction.java
index a1fdcb2..d1ee81c 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunction.java
@@ -74,7 +74,7 @@
 
     String pattern = glob.getPattern();
     // Split off the first path component of the pattern.
-    int slashPos = pattern.indexOf("/");
+    int slashPos = pattern.indexOf('/');
     String patternHead;
     String patternTail;
     if (slashPos == -1) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/LocalDiffAwareness.java b/src/main/java/com/google/devtools/build/lib/skyframe/LocalDiffAwareness.java
index 861f89ac..43d2556 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/LocalDiffAwareness.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/LocalDiffAwareness.java
@@ -188,9 +188,9 @@
 
   /** Returns the changed files caught by the watch service. */
   private Set<Path> collectChanges() throws BrokenDiffAwarenessException, IOException {
-    Set<Path> createdFilesAndDirectories = new HashSet<Path>();
-    Set<Path> deletedOrModifiedFilesAndDirectories = new HashSet<Path>();
-    Set<Path> deletedTrackedDirectories = new HashSet<Path>();
+    Set<Path> createdFilesAndDirectories = new HashSet<>();
+    Set<Path> deletedOrModifiedFilesAndDirectories = new HashSet<>();
+    Set<Path> deletedTrackedDirectories = new HashSet<>();
 
     WatchKey watchKey;
     while ((watchKey = watchService.poll()) != null) {
@@ -267,7 +267,7 @@
       throw new IOException("Root directory " + watchRootPath + " became inaccessible.");
     }
 
-    Set<Path> changedPaths = new HashSet<Path>();
+    Set<Path> changedPaths = new HashSet<>();
     for (Path path : createdFilesAndDirectories) {
       if (Files.isDirectory(path, LinkOption.NOFOLLOW_LINKS)) {
         // This is a new directory, so changes to it since its creation have not been watched.
@@ -287,7 +287,7 @@
    * paths).
    */
   private Set<Path> registerSubDirectoriesAndReturnContents(Path rootDir) throws IOException {
-    Set<Path> visitedAbsolutePaths = new HashSet<Path>();
+    Set<Path> visitedAbsolutePaths = new HashSet<>();
     // Note that this does not follow symlinks.
     Files.walkFileTree(rootDir, new WatcherFileVisitor(visitedAbsolutePaths));
     return visitedAbsolutePaths;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
index 1679810..31991c4 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
@@ -378,7 +378,7 @@
               packageLookupValue.getErrorMsg()), Transience.PERSISTENT);
         default:
           // We should never get here.
-          Preconditions.checkState(false);
+          throw new IllegalStateException();
       }
     }
 
@@ -578,8 +578,7 @@
   private void transitiveClosureOfLabels(
       ImmutableList<SkylarkFileDependency> immediateDeps, Set<Label> transitiveClosure) {
     for (SkylarkFileDependency dep : immediateDeps) {
-      if (!transitiveClosure.contains(dep.getLabel())) {
-        transitiveClosure.add(dep.getLabel());
+      if (transitiveClosure.add(dep.getLabel())) {
         transitiveClosureOfLabels(dep.getDependencies(), transitiveClosure);
       }
     }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java
index ae4ee55..f800d36 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java
@@ -152,10 +152,7 @@
       }
     } catch (NoSuchPackageException e) {
       throw new PackageLookupFunctionException(e, Transience.PERSISTENT);
-    } catch (IOException e) {
-      throw new PackageLookupFunctionException(new BuildFileContainsErrorsException(
-          PackageFunction.EXTERNAL_PACKAGE_NAME, e.getMessage()), Transience.PERSISTENT);
-    } catch (EvalException e) {
+    } catch (IOException | EvalException e) {
       throw new PackageLookupFunctionException(new BuildFileContainsErrorsException(
           PackageFunction.EXTERNAL_PACKAGE_NAME, e.getMessage()), Transience.PERSISTENT);
     }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitor.java
index 2844cc0..1abec5d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitor.java
@@ -14,7 +14,7 @@
 package com.google.devtools.build.lib.skyframe;
 
 import com.google.common.base.Preconditions;
-import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
@@ -109,9 +109,8 @@
       Label topLevelLabel = (Label) key.argument();
       if (!Iterables.isEmpty(errorInfo.getCycleInfo())) {
         skyframeCyclesReporter.get().reportCycles(errorInfo.getCycleInfo(), key, eventHandler);
-        for (Label rootCause : getRootCausesOfCycles(topLevelLabel, errorInfo.getCycleInfo())) {
-          rootCauses.put(topLevelLabel, rootCause);
-        }
+        rootCauses.putAll(
+            topLevelLabel, getRootCausesOfCycles(topLevelLabel, errorInfo.getCycleInfo()));
       }
       if (isDirectErrorFromTopLevelLabel(topLevelLabel, labelsToVisit, errorInfo)) {
         // Unlike top-level targets, which have already gone through target parsing,
@@ -131,9 +130,7 @@
       SkyKey topLevelTransitiveTargetKey = TransitiveTargetValue.key(topLevelLabel);
       TransitiveTargetValue topLevelTransitiveTargetValue = result.get(topLevelTransitiveTargetKey);
       if (topLevelTransitiveTargetValue.getTransitiveRootCauses() != null) {
-        for (Label rootCause : topLevelTransitiveTargetValue.getTransitiveRootCauses()) {
-          rootCauses.put(topLevelLabel, rootCause);
-        }
+        rootCauses.putAll(topLevelLabel, topLevelTransitiveTargetValue.getTransitiveRootCauses());
         warnAboutLoadingFailure(topLevelLabel, eventHandler);
       }
     }
@@ -251,12 +248,6 @@
   @Override
   public Multimap<Label, Label> getRootCauses(final Collection<Label> targetsToLoad) {
     Preconditions.checkState(lastBuildKeepGoing);
-    return Multimaps.filterKeys(rootCauses,
-        new Predicate<Label>() {
-      @Override
-      public boolean apply(Label label) {
-        return targetsToLoad.contains(label);
-      }
-    });
+    return Multimaps.filterKeys(rootCauses, Predicates.in(targetsToLoad));
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkModuleCycleReporter.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkModuleCycleReporter.java
index a0f37a9..7fd1b60 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkModuleCycleReporter.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkModuleCycleReporter.java
@@ -40,7 +40,7 @@
   public boolean maybeReportCycle(SkyKey topLevelKey, CycleInfo cycleInfo, boolean alreadyReported,
       EventHandler eventHandler) {
     ImmutableList<SkyKey> pathToCycle = cycleInfo.getPathToCycle();
-    if (pathToCycle.size() == 0) {
+    if (pathToCycle.isEmpty()) {
       return false;
     }
     SkyKey lastPathElement = cycleInfo.getPathToCycle().get(pathToCycle.size() - 1);
@@ -49,9 +49,10 @@
     } else if (Iterables.all(cycleInfo.getCycle(), IS_SKYLARK_MODULE_SKY_KEY)
         // The last element of the path to the cycle has to be a PackageFunction.
         && IS_PACKAGE_SKY_KEY.apply(lastPathElement)) {
-      StringBuilder cycleMessage = new StringBuilder()
-          .append(((PackageIdentifier) lastPathElement.argument()).toString() + "/BUILD: ")
-          .append("cycle in referenced extension files: ");
+      StringBuilder cycleMessage =
+          new StringBuilder()
+              .append(((PackageIdentifier) lastPathElement.argument()) + "/BUILD: ")
+              .append("cycle in referenced extension files: ");
 
       AbstractLabelCycleReporter.printCycle(cycleInfo.getCycle(), cycleMessage,
           new Function<SkyKey, String>() {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java
index 417cfca..339e431 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java
@@ -196,15 +196,11 @@
   }
 
   private static void visitTargetVisibility(Target target, Set<Label> labels) {
-    for (Label label : target.getVisibility().getDependencyLabels()) {
-      labels.add(label);
-    }
+    labels.addAll(target.getVisibility().getDependencyLabels());
   }
 
   private static void visitPackageGroup(PackageGroup packageGroup, Set<Label> labels) {
-    for (final Label include : packageGroup.getIncludes()) {
-      labels.add(include);
-    }
+    labels.addAll(packageGroup.getIncludes());
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneContextConsumer.java b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneContextConsumer.java
index 2011327..82c9f68 100644
--- a/src/main/java/com/google/devtools/build/lib/standalone/StandaloneContextConsumer.java
+++ b/src/main/java/com/google/devtools/build/lib/standalone/StandaloneContextConsumer.java
@@ -39,8 +39,7 @@
 
   @Override
   public Map<Class<? extends ActionContext>, String> getActionContexts() {
-    Builder<Class<? extends ActionContext>, String> actionContexts =
-        new ImmutableMap.Builder<Class<? extends ActionContext>, String>();
+    Builder<Class<? extends ActionContext>, String> actionContexts = new ImmutableMap.Builder<>();
 
     actionContexts.put(SpawnActionContext.class, "standalone");
 
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/AbstractFunction.java b/src/main/java/com/google/devtools/build/lib/syntax/AbstractFunction.java
index b7e3b84..7ed6d07 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/AbstractFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/AbstractFunction.java
@@ -56,7 +56,7 @@
     @Override
     public Object call(List<Object> args, Map<String, Object> kwargs, FuncallExpression ast,
         Environment env) throws EvalException, InterruptedException {
-      if (args.size() != 1 || kwargs.size() != 0) {
+      if (args.size() != 1 || !kwargs.isEmpty()) {
         throw new EvalException(ast.getLocation(), "Invalid number of arguments (expected 0)");
       }
       return call(args.get(0), ast, env);
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Argument.java b/src/main/java/com/google/devtools/build/lib/syntax/Argument.java
index 86370e6..0f53026 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Argument.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Argument.java
@@ -103,7 +103,7 @@
     }
     @Override
     public String toString() {
-      return name + " = " + String.valueOf(value);
+      return name + " = " + value;
     }
   }
 
@@ -119,7 +119,7 @@
     }
     @Override
     public String toString() {
-      return "*" + String.valueOf(value);
+      return "*" + value;
     }
   }
 
@@ -135,7 +135,7 @@
     }
     @Override
     public String toString() {
-      return "**" + String.valueOf(value);
+      return "**" + value;
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/AssignmentStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/AssignmentStatement.java
index 556fe2e..0bb5847 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/AssignmentStatement.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/AssignmentStatement.java
@@ -61,7 +61,7 @@
 
     Ident ident = (Ident) lvalue;
     Object result = expression.eval(env);
-    Preconditions.checkNotNull(result, "result of " + expression + " is null");
+    Preconditions.checkNotNull(result, "result of %s is null", expression);
 
     if (env.isSkylarkEnabled()) {
       // The variable may have been referenced successfully if a global variable
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/BuildFileAST.java b/src/main/java/com/google/devtools/build/lib/syntax/BuildFileAST.java
index 6c85ab1..0645cb3 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/BuildFileAST.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/BuildFileAST.java
@@ -62,7 +62,7 @@
     this.containsErrors = result.containsErrors;
     this.contentHashCode = contentHashCode;
     this.imports = fetchImports(this.stmts);
-    if (result.statements.size() > 0) {
+    if (!result.statements.isEmpty()) {
       setLocation(lexer.createLocation(
           result.statements.get(0).getLocation().getStartOffset(),
           result.statements.get(result.statements.size() - 1).getLocation().getEndOffset()));
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java
index 6c064e4..65f75e9 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java
@@ -81,7 +81,7 @@
     } else {
       try {
         List<MethodDescriptor> methods = FuncallExpression.getMethods(objValue.getClass(), name, 0);
-        if (methods != null && methods.size() > 0) {
+        if (methods != null && !methods.isEmpty()) {
           MethodDescriptor method = Iterables.getOnlyElement(methods);
           if (method.getAnnotation().structField()) {
             result = FuncallExpression.callMethod(
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Environment.java b/src/main/java/com/google/devtools/build/lib/syntax/Environment.java
index 19f1f3b..456007f 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Environment.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Environment.java
@@ -253,7 +253,7 @@
     out.append("}");
     if (parent != null) {
       out.append("=>");
-      out.append(parent.toString());
+      out.append(parent);
     }
     return out.toString();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java b/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java
index 5d44265..f5dd753 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java
@@ -72,11 +72,7 @@
 
   public static boolean isTuple(Class<?> c) {
     Preconditions.checkState(List.class.isAssignableFrom(c));
-    if (ImmutableList.class.isAssignableFrom(c)) {
-      return true;
-    } else {
-      return false;
-    }
+    return ImmutableList.class.isAssignableFrom(c);
   }
 
   /**
@@ -418,7 +414,7 @@
    * prettyPrintValue(Object, Appendable).
    */
   public static String prettyPrintValue(Object o) {
-    StringBuffer buffer = new StringBuffer();
+    StringBuilder buffer = new StringBuilder();
     prettyPrintValue(o, buffer);
     return buffer.toString();
   }
@@ -440,7 +436,7 @@
    * Print value 'o' to a string. Convenience overloading of printValue(Object, Appendable).
    */
   public static String printValue(Object o) {
-    StringBuffer buffer = new StringBuffer();
+    StringBuilder buffer = new StringBuilder();
     printValue(o, buffer);
     return buffer.toString();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
index fc22822..76bb559 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
@@ -422,7 +422,7 @@
       Environment env, Function function)
       throws EvalException, InterruptedException {
     ArgConversion conversion = getArgConversion(function);
-    ImmutableList.Builder<String> duplicates = new ImmutableList.Builder<String>();
+    ImmutableList.Builder<String> duplicates = new ImmutableList.Builder<>();
     // Iterate over the arguments. We assume all positional arguments come before any keyword
     // or star arguments, because the argument list was already validated by
     // Argument#validateFuncallArguments, as called by the Parser,
@@ -465,7 +465,7 @@
 
   @Override
   Object eval(Environment env) throws EvalException, InterruptedException {
-    ImmutableList.Builder<Object> posargs = new ImmutableList.Builder<Object>();
+    ImmutableList.Builder<Object> posargs = new ImmutableList.Builder<>();
     // We copy this into an ImmutableMap in the end, but we can't use an ImmutableMap.Builder, or
     // we'd still have to have a HashMap on the side for the sake of properly handling duplicates.
     Map<String, Object> kwargs = new HashMap<>();
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java
index f06829a..28639bc 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java
@@ -52,7 +52,7 @@
     ArrayList<SkylarkType> types = null;
 
     if (defaultExpressions != null) {
-      defaultValues = new ArrayList<Object>(defaultExpressions.size());
+      defaultValues = new ArrayList<>(defaultExpressions.size());
       for (Expression expr : defaultExpressions) {
         defaultValues.add(expr.eval(env));
       }
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/IfStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/IfStatement.java
index 7607e4a..3ac9817 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/IfStatement.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/IfStatement.java
@@ -80,7 +80,7 @@
    * ThenBlocks has to have at least one element.
    */
   IfStatement(List<ConditionalStatements> thenBlocks, List<Statement> elseBlock) {
-    Preconditions.checkArgument(thenBlocks.size() > 0);
+    Preconditions.checkArgument(!thenBlocks.isEmpty());
     this.thenBlocks = ImmutableList.copyOf(thenBlocks);
     this.elseBlock = ImmutableList.copyOf(elseBlock);
   }
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Lexer.java b/src/main/java/com/google/devtools/build/lib/syntax/Lexer.java
index 4c0c9b9..b49fb1e 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Lexer.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Lexer.java
@@ -756,8 +756,7 @@
     }
 
     // Like Python, always end with a NEWLINE token, even if no '\n' in input:
-    if (tokens.size() == 0
-        || tokens.get(tokens.size() - 1).kind != TokenKind.NEWLINE) {
+    if (tokens.isEmpty() || tokens.get(tokens.size() - 1).kind != TokenKind.NEWLINE) {
       addToken(new Token(TokenKind.NEWLINE, pos - 1, pos));
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ListComprehension.java b/src/main/java/com/google/devtools/build/lib/syntax/ListComprehension.java
index c48fe64..3153e8c 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/ListComprehension.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/ListComprehension.java
@@ -35,12 +35,12 @@
    */
   public ListComprehension(Expression elementExpression) {
     this.elementExpression = elementExpression;
-    lists = new ArrayList<Map.Entry<Ident, Expression>>();
+    lists = new ArrayList<>();
   }
 
   @Override
   Object eval(Environment env) throws EvalException, InterruptedException {
-    if (lists.size() == 0) {
+    if (lists.isEmpty()) {
       return convert(new ArrayList<>(), env);
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ListLiteral.java b/src/main/java/com/google/devtools/build/lib/syntax/ListLiteral.java
index fc43c2f..4d1a838 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/ListLiteral.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/ListLiteral.java
@@ -85,7 +85,7 @@
 
   @Override
   public String toString() {
-    StringBuffer sb = new StringBuffer();
+    StringBuilder sb = new StringBuilder();
     sb.append(startChar(kind));
     String sep = "";
     for (Expression e : exprs) {
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/MixedModeFunction.java b/src/main/java/com/google/devtools/build/lib/syntax/MixedModeFunction.java
index 31f2d2d..0248331 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/MixedModeFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/MixedModeFunction.java
@@ -129,7 +129,7 @@
 
     // ast is null when called from Java (as there's no Skylark call site).
     Location loc = ast == null ? location : ast.getLocation();
-    if (onlyNamedArguments && args.size() > 0) {
+    if (onlyNamedArguments && !args.isEmpty()) {
       throw new EvalException(loc,
           getSignature() + " does not accept positional arguments");
     }
@@ -227,7 +227,7 @@
    * Render this object in the form of an equivalent Python function signature.
    */
   public String getSignature() {
-    StringBuffer sb = new StringBuffer();
+    StringBuilder sb = new StringBuilder();
     sb.append(getName()).append('(');
     int ii = 0;
     int len = parameters.size();
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Parameter.java b/src/main/java/com/google/devtools/build/lib/syntax/Parameter.java
index 14267d8..b1e198b 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Parameter.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Parameter.java
@@ -111,7 +111,7 @@
 
     @Override
     public String toString() {
-      return name.toString() + "=" + String.valueOf(defaultValue);
+      return name + "=" + defaultValue;
     }
   }
 
@@ -138,7 +138,7 @@
       if (name == null) {
         return "*";
       } else {
-        return "*" + name.toString();
+        return "*" + name;
       }
     }
   }
@@ -159,7 +159,7 @@
 
     @Override
     public String toString() {
-      return "**" + name.toString();
+      return "**" + name;
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkEnvironment.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkEnvironment.java
index 7e6f414..f84c6ee 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkEnvironment.java
@@ -225,12 +225,8 @@
         }
       }
     }
-    for (String symbol : objectsToRemove) {
-      disabledVariables.add(symbol);
-    }
-    for (Class<?> moduleClass : modulesToRemove) {
-      disabledNameSpaces.add(moduleClass);
-    }
+    disabledVariables.addAll(objectsToRemove);
+    disabledNameSpaces.addAll(modulesToRemove);
   }
 
   public void handleEvent(Event event) {
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkFunction.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkFunction.java
index 6a1aadf..80d8c40 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkFunction.java
@@ -54,8 +54,8 @@
    */
   public void configure(SkylarkBuiltin annotation) {
     Preconditions.checkState(!configured);
-    Preconditions.checkArgument(getName().equals(annotation.name()),
-                                getName() + " != " + annotation.name());
+    Preconditions.checkArgument(
+        getName().equals(annotation.name()), "%s != %s", getName(), annotation.name());
     mandatoryParamNum = 0;
     ImmutableList.Builder<String> paramListBuilder = ImmutableList.builder();
     ImmutableMap.Builder<String, SkylarkBuiltin.Param> paramTypeBuilder = ImmutableMap.builder();
@@ -97,12 +97,11 @@
                      FuncallExpression ast,
                      Environment env)
       throws EvalException, InterruptedException {
-
-    Preconditions.checkState(configured, "Function " + getName() + " was not configured");
+    Preconditions.checkState(configured, "Function %s was not configured", getName());
     try {
       ImmutableMap.Builder<String, Object> arguments = new ImmutableMap.Builder<>();
       if (objectType != null && !FuncallExpression.isNamespace(objectType)) {
-        args = new ArrayList<Object>(args); // args immutable, get a mutable copy.
+        args = new ArrayList<>(args); // args immutable, get a mutable copy.
         arguments.put("self", args.remove(0));
       }
 
@@ -156,7 +155,7 @@
   private void checkTypeAndAddArg(String paramName, Object value,
       ImmutableMap.Builder<String, Object> arguments, Location loc) throws EvalException {
     SkylarkBuiltin.Param param = parameterTypes.get(paramName);
-    if (param.callbackEnabled() && Function.class.isAssignableFrom(value.getClass())) {
+    if (param.callbackEnabled() && value instanceof Function) {
       // If we pass a function as an argument we trust the Function implementation with the type
       // check. It's OK since the function needs to be called manually anyway.
       arguments.put(paramName, value);
@@ -255,9 +254,7 @@
   public static <KEY_TYPE, VALUE_TYPE> ImmutableMap<KEY_TYPE, VALUE_TYPE> toMap(
       Iterable<Map.Entry<KEY_TYPE, VALUE_TYPE>> obj) {
     ImmutableMap.Builder<KEY_TYPE, VALUE_TYPE> builder = ImmutableMap.builder();
-    for (Map.Entry<KEY_TYPE, VALUE_TYPE> entry : obj) {
-      builder.put(entry.getKey(), entry.getValue());
-    }
+    builder.putAll(obj);
     return builder.build();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkNestedSet.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkNestedSet.java
index 5ba7f4d..d946454 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkNestedSet.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkNestedSet.java
@@ -98,7 +98,7 @@
     this.contentType = Preconditions.checkNotNull(contentType, "type cannot be null");
 
     // Initializing the real nested set
-    NestedSetBuilder<Object> builder = new NestedSetBuilder<Object>(order);
+    NestedSetBuilder<Object> builder = new NestedSetBuilder<>(order);
     builder.addAll(items);
     try {
       for (NestedSet<Object> nestedSet : transitiveItems) {
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkType.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkType.java
index f6cde12..d259898 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkType.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkType.java
@@ -369,7 +369,7 @@
       return argType;
     }
     @Override public String toString() {
-      return genericType.toString() + " of " + argType.toString() + "s";
+      return genericType + " of " + argType + "s";
     }
 
     private static Interner<Combination> combinationInterner =
@@ -549,7 +549,7 @@
 
     public boolean contains(Object value) {
       // This returns true a bit too much, but it looks
-      return Function.class.isAssignableFrom(value.getClass());
+      return value instanceof Function;
     }
 
     public static SkylarkFunctionType of(String name) {
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StringLiteral.java b/src/main/java/com/google/devtools/build/lib/syntax/StringLiteral.java
index 98d5045..2193f36 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/StringLiteral.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/StringLiteral.java
@@ -27,11 +27,7 @@
 
   @Override
   public String toString() {
-    return new StringBuilder()
-        .append(quoteChar)
-        .append(value.replace(Character.toString(quoteChar), "\\" + quoteChar))
-        .append(quoteChar)
-        .toString();
+    return quoteChar + value.replace(Character.toString(quoteChar), "\\" + quoteChar) + quoteChar;
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/util/CommandBuilder.java b/src/main/java/com/google/devtools/build/lib/util/CommandBuilder.java
index 372802d..ae25c4f 100644
--- a/src/main/java/com/google/devtools/build/lib/util/CommandBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/util/CommandBuilder.java
@@ -167,7 +167,7 @@
   public Command build() {
     Preconditions.checkState(system != OS.UNKNOWN, "Unidentified operating system");
     Preconditions.checkNotNull(workingDir, "Working directory must be set");
-    Preconditions.checkState(argv.size() > 0, "At least one argument is expected");
+    Preconditions.checkState(!argv.isEmpty(), "At least one argument is expected");
 
     return new Command(
         system == OS.WINDOWS ? transformArgvForWindows() : transformArgvForLinux(),
diff --git a/src/main/java/com/google/devtools/build/lib/util/CompactStringIndexer.java b/src/main/java/com/google/devtools/build/lib/util/CompactStringIndexer.java
index 698758d..84e3c51 100644
--- a/src/main/java/com/google/devtools/build/lib/util/CompactStringIndexer.java
+++ b/src/main/java/com/google/devtools/build/lib/util/CompactStringIndexer.java
@@ -333,7 +333,7 @@
     contentOffset = VarInt.getVarInt(content, contentOffset, intHolder); // key length
     int skyKeyLen = intHolder[0];
     int remainingKeyLen = key.length - offset;
-    int minKeyLen = remainingKeyLen > skyKeyLen ? skyKeyLen : remainingKeyLen;
+    int minKeyLen = Math.min(skyKeyLen, remainingKeyLen);
 
     // Compare given key/offset content with the node key. Skip first key byte for recursive
     // calls - this byte is equal to the byte in the jump entry and was already compared.
@@ -536,7 +536,7 @@
   public synchronized String toString() {
     StringBuilder builder = new StringBuilder();
     builder.append("size = ").append(nodes.size()).append("\n");
-    if (nodes.size() > 0) {
+    if (!nodes.isEmpty()) {
       int contentSize = dumpContent(builder, rootId, 0, new boolean[nodes.size()]);
       builder.append("contentSize = ").append(contentSize).append("\n");
     }
diff --git a/src/main/java/com/google/devtools/build/lib/util/OptionsUtils.java b/src/main/java/com/google/devtools/build/lib/util/OptionsUtils.java
index 11bf94f..0ccc868 100644
--- a/src/main/java/com/google/devtools/build/lib/util/OptionsUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/util/OptionsUtils.java
@@ -35,7 +35,7 @@
    * shell-escaped.
    */
   public static String asShellEscapedString(Iterable<UnparsedOptionValueDescription> optionsList) {
-    StringBuffer result = new StringBuffer();
+    StringBuilder result = new StringBuilder();
     for (UnparsedOptionValueDescription option : optionsList) {
       if (option.isHidden()) {
         continue;
@@ -139,7 +139,7 @@
     public List<PathFragment> convert(String input) {
       List<PathFragment> list = new ArrayList<>();
       for (String piece : input.split(":")) {
-        if (!piece.equals("")) {
+        if (!piece.isEmpty()) {
           list.add(new PathFragment(piece));
         }
       }
diff --git a/src/main/java/com/google/devtools/build/lib/util/Pair.java b/src/main/java/com/google/devtools/build/lib/util/Pair.java
index a377c3c..dd48d2b 100644
--- a/src/main/java/com/google/devtools/build/lib/util/Pair.java
+++ b/src/main/java/com/google/devtools/build/lib/util/Pair.java
@@ -29,7 +29,7 @@
    * Creates a new pair containing the given elements in order.
    */
   public static <A, B> Pair<A, B> of(@Nullable A first, @Nullable B second) {
-    return new Pair<A, B>(first, second);
+    return new Pair<>(first, second);
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/util/PersistentMap.java b/src/main/java/com/google/devtools/build/lib/util/PersistentMap.java
index 7fd4b6d..123d1cf 100644
--- a/src/main/java/com/google/devtools/build/lib/util/PersistentMap.java
+++ b/src/main/java/com/google/devtools/build/lib/util/PersistentMap.java
@@ -368,9 +368,9 @@
    * @throws IOException
    */
   private void saveEntries(Map<K, V> map, Path mapFile) throws IOException {
-    DataOutputStream out = createMapFile(mapFile);
-    writeEntries(out, map);
-    out.close();
+    try (DataOutputStream out = createMapFile(mapFile)) {
+      writeEntries(out, map);
+    }
   }
 
   /**
@@ -436,7 +436,7 @@
   private boolean hasEntries(DataInputStream in, boolean failFast) throws IOException {
     if (in.available() <= 0) {
       return false;
-    } else if (!(in.readUnsignedByte() == ENTRY_MAGIC)) {
+    } else if (in.readUnsignedByte() != ENTRY_MAGIC) {
       if (failFast) {
         throw new IOException("Corrupted entry separator");
       } else {
diff --git a/src/main/java/com/google/devtools/build/lib/util/ProcMeminfoParser.java b/src/main/java/com/google/devtools/build/lib/util/ProcMeminfoParser.java
index 44c1112..57cc5fe 100644
--- a/src/main/java/com/google/devtools/build/lib/util/ProcMeminfoParser.java
+++ b/src/main/java/com/google/devtools/build/lib/util/ProcMeminfoParser.java
@@ -47,7 +47,7 @@
     List<String> lines = Files.readLines(new File(fileName), Charset.defaultCharset());
     ImmutableMap.Builder<String, Long> builder = ImmutableMap.builder();
     for (String line : lines) {
-      int colon = line.indexOf(":");
+      int colon = line.indexOf(':');
       String keyword = line.substring(0, colon);
       String valString = line.substring(colon + 1);
       try {
diff --git a/src/main/java/com/google/devtools/build/lib/util/RegexFilter.java b/src/main/java/com/google/devtools/build/lib/util/RegexFilter.java
index d7c6834..46aace3 100644
--- a/src/main/java/com/google/devtools/build/lib/util/RegexFilter.java
+++ b/src/main/java/com/google/devtools/build/lib/util/RegexFilter.java
@@ -95,7 +95,7 @@
    * Converts list of regex expressions into one compiled regex expression.
    */
   private static Pattern convertRegexListToPattern(List<String> regexList) {
-    if (regexList.size() == 0) {
+    if (regexList.isEmpty()) {
       return null;
     }
     // Wrap each individual regex in the independent group, combine them using '|' and
diff --git a/src/main/java/com/google/devtools/build/lib/util/ResourceUsage.java b/src/main/java/com/google/devtools/build/lib/util/ResourceUsage.java
index 55807f2..868bf7c 100644
--- a/src/main/java/com/google/devtools/build/lib/util/ResourceUsage.java
+++ b/src/main/java/com/google/devtools/build/lib/util/ResourceUsage.java
@@ -213,9 +213,7 @@
       long token13 = Long.parseLong(stat.next());
       long token14 = Long.parseLong(stat.next());
       return new long[] { token13, token14 };
-    } catch (NumberFormatException e) {
-      return new long[2];
-    } catch (IOException e) {
+    } catch (NumberFormatException | IOException e) {
       return new long[2];
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/util/StringUtil.java b/src/main/java/com/google/devtools/build/lib/util/StringUtil.java
index 40f7ec1..b24742c 100644
--- a/src/main/java/com/google/devtools/build/lib/util/StringUtil.java
+++ b/src/main/java/com/google/devtools/build/lib/util/StringUtil.java
@@ -80,7 +80,7 @@
     if (in == null) {
       return result;
     }
-    for (String val : Splitter.on(" ").omitEmptyStrings().split(in)) {
+    for (String val : Splitter.on(' ').omitEmptyStrings().split(in)) {
       // Note that splitter returns a substring(), effectively
       // retaining the entire "in" String. Make an explicit copy here
       // to avoid that memory pitfall. Further, because there may be
diff --git a/src/main/java/com/google/devtools/build/lib/util/StringUtilities.java b/src/main/java/com/google/devtools/build/lib/util/StringUtilities.java
index 9ac1d35..62b2afd5 100644
--- a/src/main/java/com/google/devtools/build/lib/util/StringUtilities.java
+++ b/src/main/java/com/google/devtools/build/lib/util/StringUtilities.java
@@ -114,7 +114,7 @@
     int index = 0;
 
     while ((index = input.indexOf(literal, start)) >= 0) {
-      result.append(input.substring(start, index));
+      result.append(input, start, index);
       result.append(replacement);
       start = index + literalLength;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/FileSystem.java b/src/main/java/com/google/devtools/build/lib/vfs/FileSystem.java
index 9d416098..87658ca 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/FileSystem.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/FileSystem.java
@@ -288,7 +288,7 @@
     }
     if (linkTarget.isAbsolute()) { dir = rootPath; }
     for (String name : linkTarget.segments()) {
-      if (name.equals(".") || name.equals("")) {
+      if (name.equals(".") || name.isEmpty()) {
         // no-op
       } else if (name.equals("..")) {
         Path parent = dir.getParentDirectory();
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/FileSystemUtils.java b/src/main/java/com/google/devtools/build/lib/vfs/FileSystemUtils.java
index bc55032..c3d7787 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/FileSystemUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/FileSystemUtils.java
@@ -276,7 +276,7 @@
    * ("libfoo", "-src") ==> "libfoo-src"
    */
   private static String appendWithoutExtension(String name, String toAppend) {
-    int dotIndex = name.lastIndexOf(".");
+    int dotIndex = name.lastIndexOf('.');
     if (dotIndex > 0) {
       String baseName = name.substring(0, dotIndex);
       String extension = name.substring(dotIndex);
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/Path.java b/src/main/java/com/google/devtools/build/lib/vfs/Path.java
index de222fe..dd16024 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/Path.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/Path.java
@@ -221,7 +221,7 @@
     synchronized(this) {
       if (children == null) {
         // 66% of Paths have size == 1, 80% <= 2
-        children = new IdentityHashMap<String, Reference<Path>>(1);
+        children = new IdentityHashMap<>(1);
       }
       Reference<Path> childRef = children.get(childName);
       Path child;
@@ -550,7 +550,7 @@
    * @precondition segment contains no slashes.
    */
   private Path getCanonicalPath(String segment) {
-    if (segment.equals(".") || segment.equals("")) {
+    if (segment.equals(".") || segment.isEmpty()) {
       return this; // that's a noop
     } else if (segment.equals("..")) {
       // root's parent is root, when canonicalising:
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java b/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
index 8336dc4..7587a12 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
@@ -309,19 +309,22 @@
     int segmentCount = 0;
 
     for (String segment : segments) {
-      if (segment.equals(".")) {
-        // Just discard it
-      } else if (segment.equals("..")) {
-        if (segmentCount > 0 && !scratchSegments[segmentCount - 1].equals("..")) {
-          // Remove the last segment, if there is one and it is not "..". This
-          // means that the resulting PathFragment can still contain ".."
-          // segments at the beginning.
-          segmentCount--;
-        } else {
+      switch (segment) {
+        case ".":
+          // Just discard it
+          break;
+        case "..":
+          if (segmentCount > 0 && !scratchSegments[segmentCount - 1].equals("..")) {
+            // Remove the last segment, if there is one and it is not "..". This
+            // means that the resulting PathFragment can still contain ".."
+            // segments at the beginning.
+            segmentCount--;
+          } else {
+            scratchSegments[segmentCount++] = segment;
+          }
+          break;
+        default:
           scratchSegments[segmentCount++] = segment;
-        }
-      } else {
-        scratchSegments[segmentCount++] = segment;
       }
     }
 
@@ -374,8 +377,7 @@
   public PathFragment getChild(String baseName) {
     FileSystemUtils.checkBaseName(baseName);
     baseName = StringCanonicalizer.intern(baseName);
-    String[] newSegments = new String[segments.length + 1];
-    System.arraycopy(segments, 0, newSegments, 0, segments.length);
+    String[] newSegments = Arrays.copyOf(segments, segments.length + 1);
     newSegments[newSegments.length - 1] = baseName;
     return new PathFragment(driveLetter, isAbsolute, newSegments);
   }
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/ReadonlyFileSystem.java b/src/main/java/com/google/devtools/build/lib/vfs/ReadonlyFileSystem.java
index fc668db..2b275f6 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/ReadonlyFileSystem.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/ReadonlyFileSystem.java
@@ -40,7 +40,7 @@
 
   protected IOException modificationException() {
     String longname = this.getClass().getName();
-    String shortname = longname.substring(longname.lastIndexOf(".") + 1);
+    String shortname = longname.substring(longname.lastIndexOf('.') + 1);
     return new IOException(
         shortname + " does not support mutating operations");
   }
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/RootedPath.java b/src/main/java/com/google/devtools/build/lib/vfs/RootedPath.java
index c753aa6..d382f16 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/RootedPath.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/RootedPath.java
@@ -111,6 +111,6 @@
 
   @Override
   public String toString() {
-    return "[" + root.toString() + "]/[" + relativePath.toString() + "]";
+    return "[" + root + "]/[" + relativePath + "]";
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/UnionFileSystem.java b/src/main/java/com/google/devtools/build/lib/vfs/UnionFileSystem.java
index b349b53..d2d9c00 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/UnionFileSystem.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/UnionFileSystem.java
@@ -88,7 +88,7 @@
         "please use the rootFileSystem argument instead.");
 
     this.readOnly = readOnly;
-    this.pathDelegate = new StringTrie<FileSystem>();
+    this.pathDelegate = new StringTrie<>();
 
     for (Map.Entry<PathFragment, FileSystem> prefix : prefixMapping.entrySet()) {
       FileSystem delegate = prefix.getValue();
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/UnixGlob.java b/src/main/java/com/google/devtools/build/lib/vfs/UnixGlob.java
index d512abc..441571e 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/UnixGlob.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/UnixGlob.java
@@ -33,7 +33,6 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -135,8 +134,7 @@
   }
 
   private static boolean excludedOnMatch(Path path, List<String[]> excludePatterns,
-                                         int idx, Cache<String, Pattern> cache,
-                                         Predicate<Path> dirPred) {
+                                         int idx, Cache<String, Pattern> cache) {
     for (String[] excludePattern : excludePatterns) {
       String text = path.getBaseName();
       if (idx == excludePattern.length
@@ -300,9 +298,9 @@
       return path.statNullable(symlinks);
     }
   };
-  
+
   public static final AtomicReference<FilesystemCalls> DEFAULT_SYSCALLS_REF =
-      new AtomicReference<FilesystemCalls>(DEFAULT_SYSCALLS);
+      new AtomicReference<>(DEFAULT_SYSCALLS);
 
   public static Builder forPath(Path path) {
     return new Builder(path);
@@ -350,9 +348,7 @@
      * <p>For a description of the syntax of the patterns, see {@link UnixGlob}.
      */
     public Builder addPatterns(String... patterns) {
-      for (String pattern : patterns) {
-        this.patterns.add(pattern);
-      }
+      Collections.addAll(this.patterns, patterns);
       return this;
     }
 
@@ -382,7 +378,7 @@
      * <p>For a description of the syntax of the patterns, see {@link UnixGlob}.
      */
     public Builder addExcludes(String... excludes) {
-      this.excludes.addAll(Arrays.asList(excludes));
+      Collections.addAll(this.excludes, excludes);
       return this;
     }
 
@@ -708,7 +704,7 @@
 
       if (idx == patternParts.length) { // Base case.
         if (!(excludeDirectories && baseIsDir) &&
-            !excludedOnMatch(base, excludePatterns, excludeIdx, cache, dirPred)) {
+            !excludedOnMatch(base, excludePatterns, excludeIdx, cache)) {
           results.add(base);
         }
 
@@ -774,7 +770,7 @@
           } else {
             // Instead of using an async call, just repeat the base case above.
             if (idx + 1 == patternParts.length &&
-                !excludedOnMatch(child, relevantExcludes, excludeIdx + 1, cache, dirPred)) {
+                !excludedOnMatch(child, relevantExcludes, excludeIdx + 1, cache)) {
               results.add(child);
             }
           }
diff --git a/src/main/java/com/google/devtools/build/lib/webstatusserver/IndexPageHandler.java b/src/main/java/com/google/devtools/build/lib/webstatusserver/IndexPageHandler.java
index c9eb3ed..acab0be 100644
--- a/src/main/java/com/google/devtools/build/lib/webstatusserver/IndexPageHandler.java
+++ b/src/main/java/com/google/devtools/build/lib/webstatusserver/IndexPageHandler.java
@@ -25,10 +25,10 @@
 
 import java.io.IOException;
 import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
 
-
 /**
  * Handlers for displaying the index page of server.
  *
@@ -73,9 +73,9 @@
       }
       String serializedResponse = response.toString();
       exchange.sendResponseHeaders(200, serializedResponse.length());
-      OutputStream os = exchange.getResponseBody();
-      os.write(serializedResponse.getBytes());
-      os.close();
+      try (OutputStream os = exchange.getResponseBody()) {
+        os.write(serializedResponse.getBytes(StandardCharsets.UTF_8));
+      }
     }
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/webstatusserver/StaticResourceHandler.java b/src/main/java/com/google/devtools/build/lib/webstatusserver/StaticResourceHandler.java
index cd9eb5f..1789bbf 100644
--- a/src/main/java/com/google/devtools/build/lib/webstatusserver/StaticResourceHandler.java
+++ b/src/main/java/com/google/devtools/build/lib/webstatusserver/StaticResourceHandler.java
@@ -26,6 +26,7 @@
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.net.URL;
+import java.nio.charset.StandardCharsets;
 import java.util.List;
 
 /**
@@ -64,9 +65,9 @@
   public void handle(HttpExchange exchange) throws IOException {
     exchange.getResponseHeaders().put("Content-Type", contentType);
     exchange.sendResponseHeaders(httpCode, response.length());
-    OutputStream os = exchange.getResponseBody();
-    os.write(response.getBytes());
-    os.close();
+    try (OutputStream os = exchange.getResponseBody()) {
+      os.write(response.getBytes(StandardCharsets.UTF_8));
+    }
   }
 
   public static InputStream loadFromAbsolutePath(Class<?> loadingClass, String path)
diff --git a/src/main/java/com/google/devtools/build/lib/webstatusserver/TestStatusHandler.java b/src/main/java/com/google/devtools/build/lib/webstatusserver/TestStatusHandler.java
index 41cb06d..3d1357e 100644
--- a/src/main/java/com/google/devtools/build/lib/webstatusserver/TestStatusHandler.java
+++ b/src/main/java/com/google/devtools/build/lib/webstatusserver/TestStatusHandler.java
@@ -29,6 +29,7 @@
 import java.io.IOException;
 import java.io.OutputStream;
 import java.lang.reflect.Type;
+import java.nio.charset.StandardCharsets;
 import java.util.Map;
 import java.util.Map.Entry;
 
@@ -85,9 +86,9 @@
 
       String serializedResponse = response.toString();
       exchange.sendResponseHeaders(200, serializedResponse.length());
-      OutputStream os = exchange.getResponseBody();
-      os.write(serializedResponse.getBytes());
-      os.close();
+      try (OutputStream os = exchange.getResponseBody()) {
+        os.write(serializedResponse.getBytes(StandardCharsets.UTF_8));
+      }
     }
   }
   
@@ -112,9 +113,9 @@
 
       String serializedResponse = response.toString();
       exchange.sendResponseHeaders(200, serializedResponse.length());
-      OutputStream os = exchange.getResponseBody();
-      os.write(serializedResponse.getBytes());
-      os.close();
+      try (OutputStream os = exchange.getResponseBody()) {
+        os.write(serializedResponse.getBytes(StandardCharsets.UTF_8));
+      }
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/webstatusserver/WebStatusBuildLog.java b/src/main/java/com/google/devtools/build/lib/webstatusserver/WebStatusBuildLog.java
index 86eed88..69c07e0 100644
--- a/src/main/java/com/google/devtools/build/lib/webstatusserver/WebStatusBuildLog.java
+++ b/src/main/java/com/google/devtools/build/lib/webstatusserver/WebStatusBuildLog.java
@@ -47,8 +47,8 @@
   private boolean complete = false;
   private static final Logger LOG =
       Logger.getLogger(WebStatusEventCollector.class.getCanonicalName());
-  private Map<String, JsonElement> commandInfo = new HashMap<String, JsonElement>();
-  private Map<String, JsonObject> testCases = new HashMap<String, JsonObject>();
+  private Map<String, JsonElement> commandInfo = new HashMap<>();
+  private Map<String, JsonObject> testCases = new HashMap<>();
   private long startTime;
   private ImmutableList<String> targetList;
   private UUID commandId;
diff --git a/src/main/java/com/google/devtools/build/lib/webstatusserver/WebStatusServerModule.java b/src/main/java/com/google/devtools/build/lib/webstatusserver/WebStatusServerModule.java
index 13d4c8b..507eaa5 100644
--- a/src/main/java/com/google/devtools/build/lib/webstatusserver/WebStatusServerModule.java
+++ b/src/main/java/com/google/devtools/build/lib/webstatusserver/WebStatusServerModule.java
@@ -33,6 +33,7 @@
 import java.io.IOException;
 import java.io.OutputStream;
 import java.net.InetSocketAddress;
+import java.nio.charset.StandardCharsets;
 import java.util.LinkedList;
 import java.util.UUID;
 import java.util.logging.Logger;
@@ -146,9 +147,9 @@
     public void handle(HttpExchange exchange) throws IOException {
       exchange.getResponseHeaders().put("Content-Type", ImmutableList.of("text/plain"));
       exchange.sendResponseHeaders(200, response.length());
-      OutputStream os = exchange.getResponseBody();
-      os.write(response.getBytes());
-      os.close();
+      try (OutputStream os = exchange.getResponseBody()) {
+        os.write(response.getBytes(StandardCharsets.UTF_8));
+      }
     }
   }