Skip to main content

Use lambda expressions instead of anonymous classes

org.openrewrite.staticanalysis.UseLambdaForFunctionalInterface

Instead of anonymous class declarations, use a lambda where possible. Using lambdas to replace anonymous classes can lead to more expressive and maintainable code, improve code readability, reduce code duplication, and achieve better performance in some cases.

Tags

Recipe source

GitHub: UseLambdaForFunctionalInterface.java, Issue Tracker, Code Genome Project

This recipe is available under the Moderne Source Available License. Moderne customers can download precompiled artifacts from The Code Genome Project. For non-commercial use you can build the artifact from source locally.

Example

Before
import java.util.function.Function;
class Test {
Function<Integer, Integer> f = new Function<Integer, Integer>() {
@Override
public Integer apply(Integer n) {
return n + 1;
}
};
}
After
import java.util.function.Function;
class Test {
Function<Integer, Integer> f = n -> n + 1;
}

Usage

This recipe has no required configuration options. It can be activated by adding a dependency on `org.openrewrite.recipe:rewrite-static-analysis` in your build file or by running a shell command (in which case no build changes are needed):

OpenRewrite artifacts, including the Maven and Gradle plugins themselves, are distributed through the Code Genome Project repository (https://artifacts.codegenomeproject.org/maven), which requires authentication. Sign in to the Code Genome Project to create a download token; your build authenticates with the email or username you signed in with, plus that token as the password. See the quickstart guide for details.

  1. Put your Code Genome Project credentials in ~/.gradle/gradle.properties, so that they are not committed alongside your build:
    ~/.gradle/gradle.properties
    codeGenomeUsername=you@example.com
    codeGenomeToken=your-download-token
  2. Add the Code Genome Project repository to your settings.gradle file, so that the plugin itself can be resolved:
    settings.gradle
    pluginManagement {
    repositories {
    maven {
    url = "https://artifacts.codegenomeproject.org/maven"
    credentials {
    username = providers.gradleProperty("codeGenomeUsername").get()
    password = providers.gradleProperty("codeGenomeToken").get()
    }
    }
    // Keep the portal for any other plugins your build applies
    gradlePluginPortal()
    }
    }
  3. Add the following to your build.gradle file:
    build.gradle
    plugins {
    id("org.openrewrite.rewrite") version("latest.release")
    }

    rewrite {
    activeRecipe("org.openrewrite.staticanalysis.UseLambdaForFunctionalInterface")
    setExportDatatables(true)
    }

    repositories {
    mavenCentral()
    maven {
    url = "https://artifacts.codegenomeproject.org/maven"
    credentials {
    username = providers.gradleProperty("codeGenomeUsername").get()
    password = providers.gradleProperty("codeGenomeToken").get()
    }
    }
    }

    dependencies {
    rewrite("org.openrewrite.recipe:rewrite-static-analysis:2.42.0")
    }
  4. Run gradle rewriteRun to run the recipe.

See how this recipe works across multiple open-source repositories

Run this recipe on OSS repos at scale with the Moderne SaaS.

The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories.

Please contact Moderne for more information about safely running the recipes on your own codebase in a private SaaS.

Data Tables

Anonymous functional interface implementations

org.openrewrite.staticanalysis.table.AnonymousFunctionalInterfaceImplementations

Every anonymous class that implements a functional interface, whether or not it could be rewritten to a lambda, plus the sites that could not be decided either way because the supertype carries incomplete type attribution. Sites that were not rewritten carry the reason why.

Column NameDescription
Source pathThe path to the source file containing the anonymous class.
ClassThe fully qualified name of the class containing the anonymous class.
Functional interfaceThe fully qualified name of the functional interface being implemented, or the supertype as written at the site when it did not resolve.
MethodThe name of the interface's single abstract method, or empty when type attribution was too incomplete to identify one.
Convertible to lambdaWhether the anonymous class could be rewritten to a lambda automatically.
ReasonWhy the anonymous class was not rewritten, or empty when it was. Reasons naming missing type information mark sites the recipe is blind to rather than sites that are genuinely unconvertible, which usually means the LST was built without the dependencies those types come from.