Detailed Explanation of Lambdas in Java

Srikanth
Javarevisited
Published in
3 min readSep 9, 2023

Lambdas in Java, introduced in Java 8, are a powerful and concise way to represent anonymous functions or blocks of code. They enable you to treat functions as first-class citizens, making it easier to work with collections, implement functional programming paradigms, and write more expressive and readable code.

Here’s a detailed explanation of lambdas in Java:

Syntax :

A lambda expression in Java has the following syntax:

(parameters) -> expression

Here, parameters specify the input arguments (if any), and expression represents the body of the lambda, which is evaluated when the lambda is invoked.

Functional Interfaces :

Lambdas are most commonly used with functional interfaces. A functional interface is an interface that contains only one abstract method. Java has several built-in functional interfaces in the java.util.function package, such as Consumer, Function, Predicate, and Supplier. You can also create your custom functional interfaces.

Example :

Let’s start with a simple example of a lambda expression to add two numbers:

BinaryOperator<Integer> add = (a, b) -> a + b;
int result = add.apply(3, 4); // result will be 7

In this example, BinaryOperator is a functional interface that takes two arguments and returns a result. The lambda expression (a, b) -> a + b defines how the addition operation should be performed.

Type Inference :

In many cases, you don’t need to explicitly specify the types of the lambda parameters. The Java compiler can infer them from the context. For example:

(a, b) -> a + b

The compiler knows that a and b are integers because it's used in a context where integer addition is expected.

Access to Variables :

Lambdas can access variables from their surrounding scope. However, these variables must be effectively final or explicitly marked as final or effectively final. This means you can't modify these variables inside the lambda expression.

int x = 5;
Consumer<Integer> printX = (y) -> System.out.println(x + y);

Method References :

Lambdas can be replaced with method references when they simply delegate to an existing method. For example:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(System.out::println); // Method reference

Functional Programming :

Lambdas promote functional programming in Java, allowing you to write more concise and expressive code for tasks like mapping, filtering, and reducing collections. For example:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> squares = numbers.stream()
.map(x -> x * x)
.collect(Collectors.toList());

In this example, we use the map operation with a lambda to square each number in the list.

Benefits :

  • Readability: Lambdas make code more concise and readable, especially when working with collections.
  • Code Reusability: They promote the reuse of code by encapsulating behavior.
  • Flexibility: You can pass functions as arguments to other functions, making your code more flexible and modular.
  • Parallelism: Lambdas play a crucial role in enabling parallel programming using the Stream API in Java.

In summary, lambdas in Java provide a concise and expressive way to work with functions, making code more readable and flexible. They are a fundamental feature of Java 8 and later versions, widely used for functional programming and simplifying common coding patterns.

Clap 👏 and Follow me 💌 if you like the content. You can buy me a coffee at BuyMeACoffee

Thanks for reading.

--

--

Srikanth
Javarevisited

Passionate writer in Programming, Backend Development