Unlocking the Power of Java 8: Lambda Expressions and Functional Interfaces
The Birth of Lambda Expressions
Java 8 revolutionized the programming world by introducing lambda expressions, a game-changer in the world of Java development. But before we dive into the world of lambdas, let’s first understand the concept of functional interfaces.
Functional Interfaces: The Foundation of Lambda Expressions
A functional interface is a Java interface that contains only one abstract method. This single method defines the purpose of the interface, making it a crucial component of lambda expressions. For example, the Runnable
interface from the java.lang
package is a functional interface because it has only one method, run()
.
Defining a Functional Interface
@FunctionalInterface
interface MyInterface {
int getValue();
}
The Power of Lambda Expressions
A lambda expression is essentially an anonymous or unnamed method that can be used to implement a method defined by a functional interface. It’s a concise way to represent a function without declaring a separate method.
Defining a Lambda Expression
MyInterface ref = () -> 3.1415;
In this example, we’ve created a lambda expression that returns the value of Pi. The lambda body specifies the action of the lambda expression, which in this case is returning a value.
Types of Lambda Body
There are two types of lambda bodies in Java:
- Expression Body: A lambda body with a single expression.
- Block Body: A lambda body that consists of a block of code.
Lambda Expressions with Parameters
(int n) -> { if (n % 2 == 0) System.out.println("Even"); else System.out.println("Odd"); }
This lambda expression takes an integer parameter n
and checks if it’s even or odd.
Generic Functional Interfaces
@FunctionalInterface
interface GenericInterface {
T func(T t);
}
This generic functional interface can operate on any data type.
Lambda Expressions and Stream API
Java 8 introduced the Stream API, which allows developers to perform operations like search, filter, map, reduce, or manipulate collections like Lists. Lambda expressions can be used in conjunction with the Stream API to process data in a concise and efficient manner.
Example: Using Lambdas with the Stream API
List<String> data = Arrays.asList("Nepal-Kathmandu", "India-Delhi", "Nepal-Pokhara");
data.stream()
.filter(s -> s.startsWith("Nepal"))
.map(s -> s.split("-")[1])
.forEach(System.out::println);
In this example, we’re using lambda expressions to filter, map, and process the data, reducing the lines of code drastically.