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 4672af1..9333e29 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
@@ -13,12 +13,12 @@
 // limitations under the License.
 package com.google.devtools.build.lib.syntax;
 
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
+import com.google.common.collect.Streams;
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.syntax.FuncallExpression.MethodDescriptor;
 import com.google.devtools.build.lib.util.SpellChecker;
 import java.io.IOException;
+import java.util.Optional;
 
 /** Syntax node for a dot expression. e.g. obj.field, but not obj.method() */
 public final class DotExpression extends Expression {
@@ -107,20 +107,13 @@
             : FuncallExpression.getMethods(objValue.getClass(), name);
 
     if (methods != null) {
-      methods =
-          Iterables.filter(
-              methods,
-              new Predicate<MethodDescriptor>() {
-                @Override
-                public boolean apply(MethodDescriptor methodDescriptor) {
-                  return methodDescriptor.getAnnotation().structField();
-                }
-              });
-      if (methods.iterator().hasNext()) {
-        MethodDescriptor method = Iterables.getOnlyElement(methods);
-        if (method.getAnnotation().structField()) {
-          return FuncallExpression.callMethod(method, name, objValue, new Object[] {}, loc, env);
-        }
+      Optional<MethodDescriptor> method =
+          Streams.stream(methods)
+              .filter(methodDescriptor -> methodDescriptor.getAnnotation().structField())
+              .findFirst();
+      if (method.isPresent() && method.get().getAnnotation().structField()) {
+        return FuncallExpression.callMethod(
+            method.get(), name, objValue, new Object[] {}, loc, env);
       }
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
index df37954..ae97362 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
@@ -568,12 +568,7 @@
 
   // arg_list ::= ( (arg ',')* arg ','? )?
   private List<Argument.Passed> parseFuncallArguments() {
-    List<Argument.Passed> arguments =
-        parseFunctionArguments(new Supplier<Argument.Passed>() {
-              @Override public Argument.Passed get() {
-                return parseFuncallArgument();
-              }
-            });
+    List<Argument.Passed> arguments = parseFunctionArguments(() -> parseFuncallArgument());
     try {
       Argument.validateFuncallArguments(arguments);
     } catch (Argument.ArgumentException e) {
@@ -1310,7 +1305,8 @@
     expect(TokenKind.DEF);
     Identifier ident = parseIdent();
     expect(TokenKind.LPAREN);
-    List<Parameter<Expression, Expression>> params = parseParameters();
+    List<Parameter<Expression, Expression>> params =
+        parseFunctionArguments(() -> parseFunctionParameter());
     FunctionSignature.WithValues<Expression, Expression> signature = functionSignature(params);
     expect(TokenKind.RPAREN);
     expect(TokenKind.COLON);
@@ -1330,15 +1326,6 @@
     }
   }
 
-  private List<Parameter<Expression, Expression>> parseParameters() {
-    return parseFunctionArguments(
-        new Supplier<Parameter<Expression, Expression>>() {
-          @Override public Parameter<Expression, Expression> get() {
-            return parseFunctionParameter();
-          }
-        });
-  }
-
   /**
    * Parse a list of Argument-s. The arguments can be of class Argument.Passed or Parameter,
    * as returned by the Supplier parseArgument (that, taking no argument, must be closed over
