Polishing

- Use Java 8 idioms more consistently.
- Use newer Guava idioms more consistently.
- Apply some IntelliJ IDEA refactoring suggestions.
- Other changes made for readability and/or brevity.

Closes #3462.

PiperOrigin-RevId: 164700946
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 9cf947e..1428060 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
@@ -15,8 +15,9 @@
 package com.google.devtools.build.lib.graph;
 
 import static java.util.Comparator.comparing;
+import static java.util.stream.Collectors.toCollection;
 
-import com.google.common.collect.Ordering;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
@@ -68,11 +69,7 @@
     this.order = order;
     this.transpose = transpose;
 
-    if (edgeOrder == null) {
-      this.edgeOrder = null;
-    } else {
-      this.edgeOrder = comparing(Node::getLabel, edgeOrder::compare);
-    }
+    this.edgeOrder = (edgeOrder == null) ? null : comparing(Node::getLabel, edgeOrder::compare);
   }
 
   public DFS(Order order, boolean transpose) {
@@ -98,7 +95,8 @@
     Collection<Node<T>> edgeTargets = transpose
         ? node.getPredecessors() : node.getSuccessors();
     if (edgeOrder != null) {
-      List<Node<T>> mutableNodeList = Ordering.from(edgeOrder).sortedCopy(edgeTargets);
+      List<Node<T>> mutableNodeList =
+          edgeTargets.stream().sorted(edgeOrder).collect(toCollection(ArrayList::new));
       edgeTargets = mutableNodeList;
     }
 
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 3384263..2cb3287 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
@@ -17,9 +17,9 @@
 import static java.util.Comparator.comparing;
 import static java.util.Comparator.comparingLong;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Maps;
-import com.google.common.collect.Ordering;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -266,17 +266,9 @@
     return that;
   }
 
-  /**
-   * Returns a deterministic immutable view of the nodes of this graph.
-   */
+  /** Returns a deterministic immutable copy of the nodes of this graph. */
   public Collection<Node<T>> getNodes(final Comparator<? super T> comparator) {
-    Ordering<Node<T>> ordering = new Ordering<Node<T>>() {
-      @Override
-      public int compare(Node<T> o1, Node<T> o2) {
-        return comparator.compare(o1.getLabel(), o2.getLabel());
-      }
-    };
-    return ordering.immutableSortedCopy(nodes.values());
+    return ImmutableList.sortedCopyOf(comparing(Node::getLabel, comparator), nodes.values());
   }
 
   /**
@@ -385,8 +377,7 @@
     if (label == null) {
       throw new NullPointerException();
     }
-    Node<T> n = nodes.computeIfAbsent(label, k -> new Node<T>(k, nextHashCode++));
-    return n;
+    return nodes.computeIfAbsent(label, k -> new Node<>(k, nextHashCode++));
   }
 
   /******************************************************************
@@ -463,13 +454,8 @@
    */
   public Collection<Set<Node<T>>> getStronglyConnectedComponents() {
     final List<Set<Node<T>>> sccs = new ArrayList<>();
-    NodeSetReceiver<T> r = new NodeSetReceiver<T>() {
-      @Override
-      public void accept(Set<Node<T>> scc) {
-        sccs.add(scc);
-      }
-    };
-    SccVisitor<T> v = new SccVisitor<T>();
+    NodeSetReceiver<T> r = sccs::add;
+    SccVisitor<T> v = new SccVisitor<>();
     for (Node<T> node : nodes.values()) {
       v.visit(r, node);
     }
@@ -598,7 +584,7 @@
    * list.
    */
   public static <X> List<X> getPathToTreeNode(Map<X, X> tree, X node) {
-    List<X> path = new ArrayList<X>();
+    List<X> path = new ArrayList<>();
     while (node != null) {
       path.add(node);
       node = tree.get(node); // get parent
@@ -641,8 +627,8 @@
    * @return The nodes of the graph, in a topological order
    */
   public List<Node<T>> getTopologicalOrder(Comparator<? super T> edgeOrder) {
-    CollectingVisitor<T> visitor = new CollectingVisitor<T>();
-    DFS<T> visitation = new DFS<T>(DFS.Order.POSTORDER, edgeOrder, false);
+    CollectingVisitor<T> visitor = new CollectingVisitor<>();
+    DFS<T> visitation = new DFS<>(DFS.Order.POSTORDER, edgeOrder, false);
     visitor.beginVisit();
     for (Node<T> node : getNodes(edgeOrder)) {
       visitation.visit(node, visitor);
@@ -658,7 +644,7 @@
    * Returns the nodes of an acyclic graph in post-order.
    */
   public List<Node<T>> getPostorder() {
-    CollectingVisitor<T> collectingVisitor = new CollectingVisitor<T>();
+    CollectingVisitor<T> collectingVisitor = new CollectingVisitor<>();
     visitPostorder(collectingVisitor);
     return collectingVisitor.getVisitedNodes();
   }
@@ -679,7 +665,7 @@
     // This method is intentionally not static, to permit future expansion.
     DFS<T> dfs = new DFS<T>(DFS.Order.PREORDER, false);
     for (Node<T> n : startNodes) {
-      dfs.visit(n, new AbstractGraphVisitor<T>());
+      dfs.visit(n, new AbstractGraphVisitor<>());
     }
     return dfs.getMarked();
   }
@@ -700,7 +686,7 @@
     // This method is intentionally not static, to permit future expansion.
     DFS<T> dfs = new DFS<T>(DFS.Order.PREORDER, true);
     for (Node<T> n : startNodes) {
-      dfs.visit(n, new AbstractGraphVisitor<T>());
+      dfs.visit(n, new AbstractGraphVisitor<>());
     }
     return dfs.getMarked();
   }
@@ -873,6 +859,7 @@
     }
   }
 
+  @FunctionalInterface
   private interface NodeSetReceiver<T> {
     void accept(Set<Node<T>> nodes);
   }
@@ -1025,7 +1012,7 @@
                               DFS.Order order,
                               boolean transpose,
                               Iterable<Node<T>> startNodes) {
-    DFS<T> visitation = new DFS<T>(order, transpose);
+    DFS<T> visitation = new DFS<>(order, transpose);
     visitor.beginVisit();
     for (Node<T> node: startNodes) {
       visitation.visit(node, visitor);
@@ -1045,12 +1032,9 @@
    */
   private static <T> Collection<Node<T>> maybeOrderCollection(
       Collection<Node<T>> unordered, @Nullable final Comparator<? super T> comparator) {
-    if (comparator == null) {
-      return unordered;
-    }
-    List<Node<T>> result = new ArrayList<>(unordered);
-    Collections.sort(result, makeNodeComparator(comparator));
-    return result;
+    return comparator == null
+        ? unordered
+        : ImmutableList.sortedCopyOf(makeNodeComparator(comparator), unordered);
   }
 
   private void visitNodesBeforeEdges(
diff --git a/src/main/java/com/google/devtools/build/lib/graph/LabelSerializer.java b/src/main/java/com/google/devtools/build/lib/graph/LabelSerializer.java
index b64360b..6554560 100644
--- a/src/main/java/com/google/devtools/build/lib/graph/LabelSerializer.java
+++ b/src/main/java/com/google/devtools/build/lib/graph/LabelSerializer.java
@@ -15,10 +15,8 @@
 
 package com.google.devtools.build.lib.graph;
 
-/**
- *  <p> An interface for specifying a user-defined serialization of graph node
- *  labels as strings. </p>
- */
+/** An interface for specifying a user-defined serialization of graph node labels as strings. */
+@FunctionalInterface
 public interface LabelSerializer<T> {
 
   /**
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 87f05d7..5079ed4 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
@@ -14,7 +14,6 @@
 package com.google.devtools.build.lib.graph;
 
 import com.google.common.collect.Sets;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -86,11 +85,7 @@
    * Returns a duplicate-free collection of the nodes that this node links to.
    */
   public Collection<Node<T>> getSuccessors() {
-    if (succs == null) {
-      return Collections.emptyList();
-    } else {
-      return Collections.unmodifiableCollection(succs);
-    }
+    return succs == null ? Collections.emptyList() : Collections.unmodifiableCollection(succs);
   }
 
   /**
@@ -122,11 +117,7 @@
    * this node.
    */
   public Collection<Node<T>> getPredecessors() {
-    if (preds == null) {
-      return Collections.emptyList();
-    } else {
-      return Collections.unmodifiableCollection(preds);
-    }
+    return preds == null ? Collections.emptyList() : Collections.unmodifiableCollection(preds);
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/common/options/ArgsPreProcessor.java b/src/main/java/com/google/devtools/common/options/ArgsPreProcessor.java
index 516ff1f..00e8033 100644
--- a/src/main/java/com/google/devtools/common/options/ArgsPreProcessor.java
+++ b/src/main/java/com/google/devtools/common/options/ArgsPreProcessor.java
@@ -16,6 +16,7 @@
 import java.util.List;
 
 /** Defines a preprocessing service for the "args" string list that is executed before parsing. */
+@FunctionalInterface
 interface ArgsPreProcessor {
   List<String> preProcess(List<String> args) throws OptionsParsingException;
 }
diff --git a/src/main/java/com/google/devtools/common/options/CommandNameCache.java b/src/main/java/com/google/devtools/common/options/CommandNameCache.java
index 13c85b7..622efff 100644
--- a/src/main/java/com/google/devtools/common/options/CommandNameCache.java
+++ b/src/main/java/com/google/devtools/common/options/CommandNameCache.java
@@ -16,6 +16,7 @@
 import com.google.common.collect.ImmutableSet;
 
 /** Cache mapping a command to the names of all commands it inherits from, including itself. */
+@FunctionalInterface
 public interface CommandNameCache {
   /** Class that exists only to expose a static instance variable that can be set and retrieved. */
   class CommandNameCacheInstance implements CommandNameCache {
diff --git a/src/main/java/com/google/devtools/common/options/Converters.java b/src/main/java/com/google/devtools/common/options/Converters.java
index aacc64b..cf26e71 100644
--- a/src/main/java/com/google/devtools/common/options/Converters.java
+++ b/src/main/java/com/google/devtools/common/options/Converters.java
@@ -275,9 +275,7 @@
 
     @Override
     public List<String> convert(String input) {
-      return input.equals("")
-          ? ImmutableList.<String>of()
-          : ImmutableList.copyOf(splitter.split(input));
+      return input.isEmpty() ? ImmutableList.of() : ImmutableList.copyOf(splitter.split(input));
     }
 
     @Override
@@ -311,9 +309,7 @@
       try {
         int level = Integer.parseInt(input);
         return LEVELS[level];
-      } catch (NumberFormatException e) {
-        throw new OptionsParsingException("Not a log level: " + input);
-      } catch (ArrayIndexOutOfBoundsException e) {
+      } catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
         throw new OptionsParsingException("Not a log level: " + input);
       }
     }
diff --git a/src/main/java/com/google/devtools/common/options/ExpansionFunction.java b/src/main/java/com/google/devtools/common/options/ExpansionFunction.java
index 1031125..09119b2 100644
--- a/src/main/java/com/google/devtools/common/options/ExpansionFunction.java
+++ b/src/main/java/com/google/devtools/common/options/ExpansionFunction.java
@@ -19,6 +19,7 @@
  * A function from an option parser's static setup (what flags it knows about) to a list of
  * expansion Strings to use for one of its options.
  */
+@FunctionalInterface
 public interface ExpansionFunction {
 
   /**
diff --git a/src/main/java/com/google/devtools/common/options/InvocationPolicyEnforcer.java b/src/main/java/com/google/devtools/common/options/InvocationPolicyEnforcer.java
index 9d8c13a..a66d93e 100644
--- a/src/main/java/com/google/devtools/common/options/InvocationPolicyEnforcer.java
+++ b/src/main/java/com/google/devtools/common/options/InvocationPolicyEnforcer.java
@@ -19,7 +19,6 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Multimap;
-import com.google.common.collect.Sets;
 import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.AllowValues;
 import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.DisallowValues;
 import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.FlagPolicy;
@@ -30,9 +29,9 @@
 import com.google.devtools.common.options.OptionsParser.OptionDescription;
 import com.google.devtools.common.options.OptionsParser.OptionValueDescription;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -197,7 +196,7 @@
 
     ImmutableSet<String> commandAndParentCommands =
         command == null
-            ? ImmutableSet.<String>of()
+            ? ImmutableSet.of()
             : CommandNameCache.CommandNameCacheInstance.INSTANCE.get(command);
 
     // Expand all policies to transfer policies on expansion flags to policies on the child flags.
@@ -242,8 +241,7 @@
 
     String expansionFlagName = expansionPolicy.getFlagName();
 
-    ImmutableList.Builder<OptionValueDescription> resultsBuilder =
-        ImmutableList.<OptionValueDescription>builder();
+    ImmutableList.Builder<OptionValueDescription> resultsBuilder = ImmutableList.builder();
     switch (expansionPolicy.getOperationCase()) {
       case SET_VALUE:
         {
@@ -307,7 +305,7 @@
 
     ImmutableList<OptionValueDescription> expansions =
         getExpansionsFromFlagPolicy(originalPolicy, originalOptionDescription, parser);
-    ImmutableList.Builder<OptionValueDescription> subflagBuilder = new ImmutableList.Builder<>();
+    ImmutableList.Builder<OptionValueDescription> subflagBuilder = ImmutableList.builder();
     ImmutableList<OptionValueDescription> subflags =
         subflagBuilder
             .addAll(originalOptionDescription.getImplicitRequirements())
@@ -640,7 +638,7 @@
       // of string comparison. For example, "--foo=0", "--foo=false", "--nofoo", and "-f-"
       // (if the option has an abbreviation) are all equal for boolean flags. Plus converters
       // can be arbitrarily complex.
-      Set<Object> convertedPolicyValues = Sets.newHashSet();
+      Set<Object> convertedPolicyValues = new HashSet<>();
       for (String value : policyValues) {
         Object convertedValue = optionDescription.getConverter().convert(value);
         // Some converters return lists, and if the flag is a repeatable flag, the items in the
@@ -807,7 +805,7 @@
     parser.parseWithSourceFunction(
         OptionPriority.INVOCATION_POLICY,
         INVOCATION_POLICY_SOURCE,
-        Arrays.asList(String.format("--%s=%s", flagName, flagValue)));
+        ImmutableList.of(String.format("--%s=%s", flagName, flagValue)));
   }
 }
 
diff --git a/src/main/java/com/google/devtools/common/options/Options.java b/src/main/java/com/google/devtools/common/options/Options.java
index 88cf5f8..c52e395 100644
--- a/src/main/java/com/google/devtools/common/options/Options.java
+++ b/src/main/java/com/google/devtools/common/options/Options.java
@@ -52,8 +52,7 @@
     OptionsParser parser = OptionsParser.newOptionsParser(optionsClass);
     parser.parse(OptionPriority.COMMAND_LINE, null, Arrays.asList(args));
     List<String> remainingArgs = parser.getResidue();
-    return new Options<O>(parser.getOptions(optionsClass),
-                          remainingArgs.toArray(new String[0]));
+    return new Options<>(parser.getOptions(optionsClass), remainingArgs.toArray(new String[0]));
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/common/options/OptionsData.java b/src/main/java/com/google/devtools/common/options/OptionsData.java
index 48f47ff..c5fd9a9 100644
--- a/src/main/java/com/google/devtools/common/options/OptionsData.java
+++ b/src/main/java/com/google/devtools/common/options/OptionsData.java
@@ -125,8 +125,7 @@
     IsolatedOptionsData isolatedData = IsolatedOptionsData.from(classes);
 
     // All that's left is to compute expansions.
-    ImmutableMap.Builder<Field, ExpansionData> expansionDataBuilder =
-        ImmutableMap.<Field, ExpansionData>builder();
+    ImmutableMap.Builder<Field, ExpansionData> expansionDataBuilder = ImmutableMap.builder();
     for (Map.Entry<String, Field> entry : isolatedData.getAllNamedFields()) {
       Field field = entry.getValue();
       Option annotation = field.getAnnotation(Option.class);
@@ -154,7 +153,7 @@
           throw new AssertionError(e);
         }
 
-        ImmutableList<String> staticExpansion = null;
+        ImmutableList<String> staticExpansion;
         try {
           staticExpansion = instance.getExpansion(new ExpansionContext(isolatedData, field, null));
           Preconditions.checkState(
diff --git a/src/main/java/com/google/devtools/common/options/OptionsParser.java b/src/main/java/com/google/devtools/common/options/OptionsParser.java
index b507785..d4779fe 100644
--- a/src/main/java/com/google/devtools/common/options/OptionsParser.java
+++ b/src/main/java/com/google/devtools/common/options/OptionsParser.java
@@ -14,9 +14,12 @@
 
 package com.google.devtools.common.options;
 
+import static java.util.Comparator.comparing;
+
 import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ListMultimap;
 import com.google.common.escape.Escaper;
 import java.lang.reflect.Constructor;
@@ -25,8 +28,6 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
@@ -133,7 +134,7 @@
    */
   static OptionsData getOptionsDataInternal(Class<? extends OptionsBase> optionsClass)
       throws ConstructionException {
-    return getOptionsDataInternal(ImmutableList.<Class<? extends OptionsBase>>of(optionsClass));
+    return getOptionsDataInternal(ImmutableList.of(optionsClass));
   }
 
   /**
@@ -157,8 +158,7 @@
   public static OptionsParser newOptionsParser(
       Iterable<? extends Class<? extends OptionsBase>> optionsClasses)
       throws ConstructionException {
-    return newOptionsParser(
-        getOptionsDataInternal(ImmutableList.<Class<? extends OptionsBase>>copyOf(optionsClasses)));
+    return newOptionsParser(getOptionsDataInternal(ImmutableList.copyOf(optionsClasses)));
   }
 
   /**
@@ -212,8 +212,7 @@
   public void parseAndExitUponError(OptionPriority priority, String source, String[] args) {
     for (String arg : args) {
       if (arg.equals("--help")) {
-        System.out.println(describeOptions(Collections.<String, String>emptyMap(),
-                                           HelpVerbosity.LONG));
+        System.out.println(describeOptions(ImmutableMap.of(), HelpVerbosity.LONG));
         System.exit(0);
       }
     }
@@ -540,7 +539,7 @@
       for (Class<? extends OptionsBase> optionsClass : data.getOptionsClasses()) {
         allFields.addAll(data.getFieldsForClass(optionsClass));
       }
-      Collections.sort(allFields, OptionsUsage.BY_CATEGORY);
+      allFields.sort(OptionsUsage.BY_CATEGORY);
       String prevCategory = null;
 
       for (Field optionField : allFields) {
@@ -583,7 +582,7 @@
       for (Class<? extends OptionsBase> optionsClass : data.getOptionsClasses()) {
         allFields.addAll(data.getFieldsForClass(optionsClass));
       }
-      Collections.sort(allFields, OptionsUsage.BY_CATEGORY);
+      allFields.sort(OptionsUsage.BY_CATEGORY);
       String prevCategory = null;
 
       for (Field optionField : allFields) {
@@ -621,26 +620,17 @@
     OptionsData data = impl.getOptionsData();
     StringBuilder desc = new StringBuilder();
 
-    // List all options
-    List<Field> allFields = new ArrayList<>();
-    for (Class<? extends OptionsBase> optionsClass : data.getOptionsClasses()) {
-      allFields.addAll(data.getFieldsForClass(optionsClass));
-    }
-    // Sort field for deterministic ordering
-    Collections.sort(allFields, new Comparator<Field>() {
-      @Override
-      public int compare(Field f1, Field f2) {
-        String name1 = f1.getAnnotation(Option.class).name();
-        String name2 = f2.getAnnotation(Option.class).name();
-        return name1.compareTo(name2);
-      }
-    });
-    for (Field optionField : allFields) {
-      Option option = optionField.getAnnotation(Option.class);
-      if (option.documentationCategory() != OptionDocumentationCategory.UNDOCUMENTED) {
-        OptionsUsage.getCompletion(optionField, desc);
-      }
-    }
+    data.getOptionsClasses()
+        // List all options
+        .stream()
+        .flatMap(optionsClass -> data.getFieldsForClass(optionsClass).stream())
+        // Sort field for deterministic ordering
+        .sorted(comparing(optionField -> optionField.getAnnotation(Option.class).name()))
+        .filter(
+            optionField ->
+                optionField.getAnnotation(Option.class).documentationCategory()
+                    != OptionDocumentationCategory.UNDOCUMENTED)
+        .forEach(optionField -> OptionsUsage.getCompletion(optionField, desc));
 
     return desc.toString();
   }
@@ -744,8 +734,7 @@
    */
   public OptionValueDescription clearValue(String optionName)
       throws OptionsParsingException {
-    OptionValueDescription clearedValue = impl.clearValue(optionName);
-    return clearedValue;
+    return impl.clearValue(optionName);
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/common/options/OptionsParserImpl.java b/src/main/java/com/google/devtools/common/options/OptionsParserImpl.java
index d49d5c4..5ebd4a5 100644
--- a/src/main/java/com/google/devtools/common/options/OptionsParserImpl.java
+++ b/src/main/java/com/google/devtools/common/options/OptionsParserImpl.java
@@ -14,15 +14,15 @@
 
 package com.google.devtools.common.options;
 
+import static java.util.Comparator.comparing;
+import static java.util.stream.Collectors.toCollection;
+
 import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
-import com.google.common.base.Predicate;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
 import com.google.common.collect.Iterators;
 import com.google.common.collect.LinkedHashMultimap;
-import com.google.common.collect.Lists;
 import com.google.common.collect.Multimap;
 import com.google.devtools.common.options.OptionsParser.OptionDescription;
 import com.google.devtools.common.options.OptionsParser.OptionValueDescription;
@@ -31,8 +31,6 @@
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
@@ -121,74 +119,50 @@
    * Implements {@link OptionsParser#asListOfUnparsedOptions()}.
    */
   List<UnparsedOptionValueDescription> asListOfUnparsedOptions() {
-    List<UnparsedOptionValueDescription> result = Lists.newArrayList(unparsedValues);
-    // It is vital that this sort is stable so that options on the same priority are not reordered.
-    Collections.sort(result, new Comparator<UnparsedOptionValueDescription>() {
-      @Override
-      public int compare(UnparsedOptionValueDescription o1,
-          UnparsedOptionValueDescription o2) {
-        return o1.getPriority().compareTo(o2.getPriority());
-      }
-    });
-    return result;
+    return unparsedValues
+        .stream()
+        // It is vital that this sort is stable so that options on the same priority are not
+        // reordered.
+        .sorted(comparing(UnparsedOptionValueDescription::getPriority))
+        .collect(toCollection(ArrayList::new));
   }
 
   /**
    * Implements {@link OptionsParser#asListOfExplicitOptions()}.
    */
   List<UnparsedOptionValueDescription> asListOfExplicitOptions() {
-    List<UnparsedOptionValueDescription> result = Lists.newArrayList(Iterables.filter(
-      unparsedValues,
-      new Predicate<UnparsedOptionValueDescription>() {
-        @Override
-        public boolean apply(UnparsedOptionValueDescription input) {
-          return input.isExplicit();
-        }
-    }));
-    // It is vital that this sort is stable so that options on the same priority are not reordered.
-    Collections.sort(result, new Comparator<UnparsedOptionValueDescription>() {
-      @Override
-      public int compare(UnparsedOptionValueDescription o1,
-          UnparsedOptionValueDescription o2) {
-        return o1.getPriority().compareTo(o2.getPriority());
-      }
-    });
-    return result;
+    return unparsedValues
+        .stream()
+        .filter(UnparsedOptionValueDescription::isExplicit)
+        // It is vital that this sort is stable so that options on the same priority are not
+        // reordered.
+        .sorted(comparing(UnparsedOptionValueDescription::getPriority))
+        .collect(toCollection(ArrayList::new));
   }
 
   /**
    * Implements {@link OptionsParser#canonicalize}.
    */
   List<String> asCanonicalizedList() {
-
-    List<UnparsedOptionValueDescription> processed = Lists.newArrayList(
-        canonicalizeValues.values());
-    // Sort implicit requirement options to the end, keeping their existing order, and sort the
-    // other options alphabetically.
-    Collections.sort(processed, new Comparator<UnparsedOptionValueDescription>() {
-      @Override
-      public int compare(UnparsedOptionValueDescription o1, UnparsedOptionValueDescription o2) {
-        if (o1.isImplicitRequirement()) {
-          return o2.isImplicitRequirement() ? 0 : 1;
-        }
-        if (o2.isImplicitRequirement()) {
-          return -1;
-        }
-        return o1.getName().compareTo(o2.getName());
-      }
-    });
-
-    List<String> result = new ArrayList<>();
-    for (UnparsedOptionValueDescription value : processed) {
-
-      // Ignore expansion options.
-      if (value.isExpansion()) {
-        continue;
-      }
-
-      result.add("--" + value.getName() + "=" + value.getUnparsedValue());
-    }
-    return result;
+    return canonicalizeValues
+        .values()
+        .stream()
+        // Sort implicit requirement options to the end, keeping their existing order, and sort
+        // the other options alphabetically.
+        .sorted(
+            (v1, v2) -> {
+              if (v1.isImplicitRequirement()) {
+                return v2.isImplicitRequirement() ? 0 : 1;
+              }
+              if (v2.isImplicitRequirement()) {
+                return -1;
+              }
+              return v1.getName().compareTo(v2.getName());
+            })
+        // Ignore expansion options.
+        .filter(value -> !value.isExpansion())
+        .map(value -> "--" + value.getName() + "=" + value.getUnparsedValue())
+        .collect(toCollection(ArrayList::new));
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/common/options/OptionsUsage.java b/src/main/java/com/google/devtools/common/options/OptionsUsage.java
index 5f7c48a..6971e27 100644
--- a/src/main/java/com/google/devtools/common/options/OptionsUsage.java
+++ b/src/main/java/com/google/devtools/common/options/OptionsUsage.java
@@ -21,7 +21,6 @@
 import java.lang.reflect.Field;
 import java.text.BreakIterator;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 import javax.annotation.Nullable;
@@ -43,7 +42,7 @@
   static void getUsage(Class<? extends OptionsBase> optionsClass, StringBuilder usage) {
     OptionsData data = OptionsParser.getOptionsDataInternal(optionsClass);
     List<Field> optionFields = new ArrayList<>(data.getFieldsForClass(optionsClass));
-    Collections.sort(optionFields, BY_NAME);
+    optionFields.sort(BY_NAME);
     for (Field optionField : optionFields) {
       getUsage(optionField, usage, OptionsParser.HelpVerbosity.LONG, null);
     }
@@ -119,7 +118,7 @@
     String flagName = getFlagName(optionField);
     String typeDescription = getTypeDescription(optionField);
     Option annotation = optionField.getAnnotation(Option.class);
-    usage.append("  --" + flagName);
+    usage.append("  --").append(flagName);
     if (helpVerbosity == OptionsParser.HelpVerbosity.SHORT) { // just the name
       usage.append('\n');
       return;
@@ -128,7 +127,7 @@
       usage.append(" [-").append(annotation.abbrev()).append(']');
     }
     if (!typeDescription.equals("")) {
-      usage.append(" (" + typeDescription + "; ");
+      usage.append(" (").append(typeDescription).append("; ");
       if (annotation.allowMultiple()) {
         usage.append("may be used multiple times");
       } else {
@@ -137,7 +136,7 @@
         if (OptionsParserImpl.isSpecialNullDefault(defaultValueString, optionField)) {
           usage.append("default: see description");
         } else {
-          usage.append("default: \"" + defaultValueString + "\"");
+          usage.append("default: \"").append(defaultValueString).append("\"");
         }
       }
       usage.append(")");
diff --git a/src/main/java/com/google/devtools/common/options/ParamsFilePreProcessor.java b/src/main/java/com/google/devtools/common/options/ParamsFilePreProcessor.java
index bd1c5a9..30b67ed 100644
--- a/src/main/java/com/google/devtools/common/options/ParamsFilePreProcessor.java
+++ b/src/main/java/com/google/devtools/common/options/ParamsFilePreProcessor.java
@@ -152,11 +152,7 @@
       }
 
       // check to see if the current position is escaped
-      if (lastChar == '\\') {
-        escaped = true;
-      } else {
-        escaped = false;
-      }
+      escaped = (lastChar == '\\');
 
       if (!escaped && current == '\'') {
         singleQuoteStart = singleQuoteStart == -1 ? readerPosition : -1;
diff --git a/src/main/java/com/google/devtools/common/options/testing/ConverterTester.java b/src/main/java/com/google/devtools/common/options/testing/ConverterTester.java
index 7d0b8d3..86f87f3 100644
--- a/src/main/java/com/google/devtools/common/options/testing/ConverterTester.java
+++ b/src/main/java/com/google/devtools/common/options/testing/ConverterTester.java
@@ -88,7 +88,7 @@
    * @see EqualsTester#addEqualityGroup
    */
   public ConverterTester addEqualityGroup(String... inputs) {
-    ImmutableList.Builder<WrappedItem> wrapped = new ImmutableList.Builder<>();
+    ImmutableList.Builder<WrappedItem> wrapped = ImmutableList.builder();
     ImmutableList<String> inputList = ImmutableList.copyOf(inputs);
     inputLists.add(inputList);
     for (String input : inputList) {
diff --git a/src/main/java/com/google/devtools/common/options/testing/ConverterTesterMap.java b/src/main/java/com/google/devtools/common/options/testing/ConverterTesterMap.java
index afa0231..cf028b9 100644
--- a/src/main/java/com/google/devtools/common/options/testing/ConverterTesterMap.java
+++ b/src/main/java/com/google/devtools/common/options/testing/ConverterTesterMap.java
@@ -44,7 +44,7 @@
     private final ImmutableMap.Builder<Class<? extends Converter<?>>, ConverterTester> delegate;
 
     public Builder() {
-      this.delegate = new ImmutableMap.Builder<>();
+      this.delegate = ImmutableMap.builder();
     }
 
     /**
@@ -71,9 +71,7 @@
      * permitted; duplicates will cause {@link #build} to fail.
      */
     public Builder addAll(Iterable<ConverterTester> items) {
-      for (ConverterTester item : items) {
-        add(item);
-      }
+      items.forEach(this::add);
       return this;
     }
 
diff --git a/src/main/java/com/google/devtools/common/options/testing/OptionsTester.java b/src/main/java/com/google/devtools/common/options/testing/OptionsTester.java
index fa58462..9ecfdc5 100644
--- a/src/main/java/com/google/devtools/common/options/testing/OptionsTester.java
+++ b/src/main/java/com/google/devtools/common/options/testing/OptionsTester.java
@@ -38,7 +38,7 @@
   }
 
   private static ImmutableList<Field> getAllFields(Class<? extends OptionsBase> optionsClass) {
-    ImmutableList.Builder<Field> builder = new ImmutableList.Builder<>();
+    ImmutableList.Builder<Field> builder = ImmutableList.builder();
     Class<? extends OptionsBase> current = optionsClass;
     while (!OptionsBase.class.equals(current)) {
       builder.add(current.getDeclaredFields());
@@ -103,7 +103,7 @@
    */
   public OptionsTester testAllDefaultValuesTestedBy(ConverterTesterMap testers) {
     ImmutableListMultimap.Builder<Class<? extends Converter<?>>, Field> converterClassesBuilder =
-        new ImmutableListMultimap.Builder<>();
+        ImmutableListMultimap.builder();
     for (Field field : getAllFields(optionsClass)) {
       Option option = field.getAnnotation(Option.class);
       if (option != null && !Converter.class.equals(option.converter())) {
diff --git a/src/main/java/com/google/devtools/skylark/Skylark.java b/src/main/java/com/google/devtools/skylark/Skylark.java
index 9f1181e..3e4d77e 100644
--- a/src/main/java/com/google/devtools/skylark/Skylark.java
+++ b/src/main/java/com/google/devtools/skylark/Skylark.java
@@ -105,7 +105,7 @@
       System.err.println(e.print());
       return 1;
     } catch (Exception e) {
-      System.err.println(e);
+      e.printStackTrace(System.err);
       return 1;
     }
   }