Functional Interfaces in Java
1. Introduction
Functional Interfaces are a core concept in Java's functional programming capabilities introduced in Java 8. They allow the use of lambda expressions, which enable clearer and more concise code.
2. Definition
A Functional Interface is an interface that contains exactly one abstract method. These interfaces can have multiple default or static methods but can only have one abstract method to qualify as a functional interface.
Runnable, Callable, Comparator, and interfaces from the java.util.function package such as Function, Consumer, and Supplier.
        3. Key Concepts
- Functional Interfaces can be used as the assignment target for lambda expressions or method references.
 - You can use the 
@FunctionalInterfaceannotation to indicate that an interface is intended to be a functional interface. This is optional but helps with code clarity. - Lambda expressions provide a clear and concise way to represent a single method interface using an expression.
 
4. Code Examples
4.1 Basic Example of a Functional Interface
@FunctionalInterface
interface MyFunctionalInterface {
    void execute();
}
public class Main {
    public static void main(String[] args) {
        MyFunctionalInterface myFunc = () -> System.out.println("Hello, Functional Interface!");
        myFunc.execute();
    }
}
        
        4.2 Using Built-in Functional Interfaces
import java.util.function.Function;
public class Main {
    public static void main(String[] args) {
        Function square = x -> x * x;
        System.out.println("Square of 5: " + square.apply(5)); // Outputs 25
    }
}
        
        5. Best Practices
- Always use the 
@FunctionalInterfaceannotation for clarity. - Keep functional interfaces simple; ideally, they should represent a single action.
 - Utilize built-in functional interfaces from the 
java.util.functionpackage whenever possible. 
6. FAQ
What is a lambda expression?
A lambda expression is a concise way to represent an anonymous function that can be passed around. It can be used primarily to implement functional interfaces.
Can a functional interface have multiple abstract methods?
No, a functional interface cannot have multiple abstract methods. It should have exactly one abstract method to maintain its functional nature.
What happens if I annotate an interface with @FunctionalInterface that is not a functional interface?
                The compiler will throw an error indicating that the interface does not satisfy the requirements of a functional interface.
