bugl
bugl
HomeLearnPatternsPathsSearchPremium
HomeLearnPatternsPaths
Learn/Java/Java Advanced
Java•Java Advanced

Java Lambda Expressions

Lambda Expressions were added in Java 8.

A lambda expression is a short block of code that takes in parameters and returns a value. Lambdas look similar to methods, but they do not need a name, and they can be written right inside a method body.

Syntax

The simplest lambda expression contains a single parameter and an expression:

parameter
-> expression

To use more than one parameter, wrap them in parentheses:

( parameter1 , parameter2 ) -> expression

Simple expressions must return a value immediately. They cannot contain multiple statements, such as loops or if conditions. To do more complex work, use a code block with curly braces. If the lambda should return a value, use the return keyword:

( parameter1 , parameter2 ) -> {
 // code block
 return result ;
}

Using Lambda Expressions

Lambdas are often passed as arguments to methods. For example, you can use a lambda in the forEach() method of an ArrayList :

Example

import java.util.ArrayList;
public class Main {
  public static void main(String[] args) {
    ArrayList<Integer> numbers = new ArrayList<Integer>();
    numbers.add(5);
    numbers.add(9);
    numbers.add(8);
    numbers.add(1);
    numbers.forEach((n) -> { System.out.println(n); });
  }
}

Lambdas in Variables

A lambda expression can be stored in a variable. The variable's type must be an interface with exactly one method (a functional interface ). The lambda must match that method's parameters and return type.

Java includes many built-in functional interfaces, such as Consumer (from the java.util package) used with lists.

Example

import java.util.ArrayList;
import java.util.function.Consumer;
public class Main {
  public static void main(String[] args) {
    ArrayList<Integer> numbers = new ArrayList<Integer>();
    numbers.add(5);
    numbers.add(9);
    numbers.add(8);
    numbers.add(1);
    Consumer<Integer> method = (n) -> { System.out.println(n); };
    numbers.forEach(method);
  }
}

Lambdas as Method Parameters

You can also pass a lambda expression to a method. The method's parameter must be a functional interface. Calling the interface's method will then run the lambda expression:

Example

interface StringFunction {
  String run(String str);
}
public class Main {
  public static void main(String[] args) {
    StringFunction exclaim = (s) -> s + "!";
    StringFunction ask = (s) -> s + "?";
    printFormatted("Hello", exclaim);
    printFormatted("Hello", ask);
  }
public static void printFormatted(String str, StringFunction format) {
  String result = format.run(str);
  System.out.println(result);
}
}

Anonymous Class vs. Lambda Expression

In Java 8+, you can often replace an anonymous class with a lambda expression - but only if the interface is a functional interface (one abstract method).

Runnable example

// Functional interface (one abstract method) interface Greeting { void sayHello();
}
public class Main {
  public static void main(String[] args) {
    Greeting g = new Greeting() {
      public void sayHello() {
        System.out.println("Hello from anonymous class");
      }
  };
g.sayHello();
}
}

Runnable example

// Same functional interface interface Greeting { void sayHello();
}
public class Main {
  public static void main(String[] args) {
    Greeting g = () -> System.out.println("Hello from lambda");
    g.sayHello();
  }
}

Rule of thumb: Use a lambda for short, single-method interfaces. Use an anonymous class when you need to override multiple methods, add fields, or extend a class.

Previous

Java Threads

Next

Java Advanced Sorting (Comparator and Comparable)

This chapter

Overview
7

Lessons

32m

Read time

1. Java Wrapper Classes2. Java Generics3. Java Annotations4. Java Regular Expressions5. Java Threads6. Java Lambda Expressions7. Java Advanced Sorting (Comparator and Comparable)

On this page

Using Lambda ExpressionsLambdas in VariablesLambdas as Method ParametersAnonymous Class vs. Lambda Expression