Java > Java 8 Features > Lambda Expressions > Custom Functional Interfaces
Custom Functional Interface and Lambda Expression Example
This example demonstrates how to create a custom functional interface in Java and use a lambda expression to implement it. It showcases a simple scenario where we define an interface for number processing and then implement it using a lambda.
Defining the Custom Functional Interface
This code defines a functional interface called `NumberProcessor`. A functional interface is an interface with only one abstract method. In this case, the `process` method takes an integer as input and returns an integer. Because it has one abstract method, we can use it with lambda expressions.
interface NumberProcessor {
int process(int x);
}
Implementing the Interface with a Lambda Expression
Here, we create two lambda expressions: `square` and `increment`. The `square` lambda takes an integer `x` and returns its square (`x * x`). The `increment` lambda takes an integer `x` and returns `x + 1`. These lambdas are assigned to variables of type `NumberProcessor`, effectively implementing the `process` method of the interface. The `main` method then calls these lambdas with a sample number (5) and prints the results.
public class CustomFunctionalInterface {
public static void main(String[] args) {
NumberProcessor square = (x) -> x * x;
NumberProcessor increment = (x) -> x + 1;
int num = 5;
System.out.println("Square of " + num + " is: " + square.process(num));
System.out.println("Increment of " + num + " is: " + increment.process(num));
}
}
Concepts Behind the Snippet
This snippet demonstrates the core concepts of functional interfaces and lambda expressions in Java 8 and later. A functional interface enables treating functionality as a method argument, or code as data. Lambda expressions provide a concise syntax for defining anonymous functions that implement these interfaces.
Real-Life Use Case
Imagine you have a list of products and need to apply different discounts based on various criteria (e.g., product category, price range, customer type). You can create a functional interface `DiscountCalculator` with a method like `calculateDiscount(Product product)`. Then, you can use lambda expressions to define different discount calculation strategies (e.g., `(Product p) -> p.getPrice() * 0.10` for a 10% discount) and pass these lambdas to a method that applies the discounts. This allows for flexible and easily configurable discount logic.
Best Practices
Interview Tip
When discussing functional interfaces and lambdas in an interview, be prepared to explain the difference between an interface and a functional interface. Also, be ready to provide examples of how lambda expressions can simplify code and improve readability compared to anonymous inner classes.
When to use them
Use functional interfaces and lambda expressions when you want to pass behavior as an argument to a method, or when you want to create concise, inline implementations of simple interfaces. They are particularly useful when working with collections and streams.
Alternatives
Before Java 8, anonymous inner classes were used to achieve similar functionality. However, lambda expressions provide a more concise and readable syntax. You can also use regular methods instead of lambdas, but that often requires more boilerplate code and can reduce flexibility.
Pros
Cons
FAQ
-
What is the difference between an interface and a functional interface?
An interface can have multiple methods, while a functional interface is specifically designed to have only one abstract method. Functional interfaces are annotated with `@FunctionalInterface` (though it's not strictly required), which helps the compiler verify that the interface adheres to the single abstract method rule. -
Can I use a lambda expression with an interface that has more than one method?
No, lambda expressions can only be used with functional interfaces (interfaces with a single abstract method). If an interface has more than one method, you need to use an anonymous inner class or a regular class implementation. -
What are some common functional interfaces in Java?
Some common functional interfaces in Java's `java.util.function` package include `Function` (takes T, returns R), `Predicate ` (takes T, returns boolean), `Consumer ` (takes T, returns void), `Supplier ` (takes no argument, returns T), and `Runnable` (takes no argument, returns void).