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));
+      }
     }
   }
 
