bugl
bugl
HomeLearnPatternsPathsSearch
HomeLearnPatternsPathsSearch

Loading lesson path

Learn/Java/Java Advanced
Java•Java Advanced

Java Lambda Expressions

Flash cards

Review the key moves

1/4
Core idea

What is the main idea behind Java Lambda Expressions?

Lesson checks

Practice each idea before moving on

Short Mimo-style checks built from this lesson's code, terms, and sequence.

1Quick choice

Which statement best captures the main point of this lesson?

2Fill blank

Complete the missing token from the example code.

-> ___
3Order

Put the learning moves in the order that makes the concept easiest to apply.

Lambdas in Variables
Using Lambda Expressions
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)