docs: @Override
    public Description matchMethod(MethodTree tree, VisitorState state) {
  
      MethodSymbol methodSym = ASTHelpers.getSymbol(tree);
  
      // precondition (1)
      if (!methodSym.getModifiers().contains(Modifier.PRIVATE)) {
        return Description.NO_MATCH;
      }
  
      ImmutableList<Tree> params =
          tree.getParameters().stream()
              .filter(param -> hasFunctionAsArg(param, state))
              .filter(
                  param ->
                      isFunctionArgSubtypeOf(
                              param, 0, state.getTypeFromString(JAVA_LANG_NUMBER), state)
                          || isFunctionArgSubtypeOf(
                              param, 1, state.getTypeFromString(JAVA_LANG_NUMBER), state))
              .collect(toImmutableList());
  
      // preconditions (2) and (3)
      if (params.isEmpty() || !methodCallsMeetConditions(methodSym, state)) {
        return Description.NO_MATCH;
      }
  
      SuggestedFix.Builder fixBuilder = SuggestedFix.builder();
      for (Tree param : params) {
        getMappingForFunctionFromTree(param)
            .ifPresent(
                mappedFunction -> {
                  fixBuilder.addImport(getImportName(mappedFunction));
                  fixBuilder.replace(
                      param,
                      getFunctionName(mappedFunction) + " " + ASTHelpers.getSymbol(param).name);
                  refactorInternalApplyMethods(tree, fixBuilder, param, mappedFunction);
                });
      }
  
      return describeMatch(tree, fixBuilder.build());
    }