Skip to main content

Functional Interface In Java 8 with Examples - @FunctionalInterface

functinal interface in java with examples

What is Functional Interface in Java 8? | What is @FunctionalInterface In Java

In Java 8 Functional Interface concept introduced. I will explain what is functional interface and why we use?
So lets start..

What is Functional Interface?
 
functional Interface is Interface that only have one Abstract method. For Qualify functional Interface in java, class only have one Abstract Method.
 
Any Interface is called Functional Interface if it contains only one Abstract method in it.
 
functional interfaces are called SAM (Single Abstract Method) since they have only single abstract method and can have any default and static method. 

One of the major benefits of functional interface is we can use lambda expressions to instantiate them.

Learn about Lambda expression first so you have clear understanding about it.

Lambda expression and its use cases


Following Code of Functional Interface.
@FunctionalInterface
public interface FunctionalInterface {

public static void main(String args[]) {
System.out.println("Main Method");
}
public void abstractMethod();

}

In above code @FunctionalInterface annotation used that is specify that it is Functional Interface.
@FunactionalInterface is Optional but if you use then you must have one Abstract method in your Interface otherwise it gives Error ("Invalid '@FunctionalInterface' annotation; FunctionalInterface is not a functional interface").
If you add another abstract Method in FunctionalInterface then it also cause Error. Checkout following two images for better understanding.
 
functional interface with one abstract, default and static method
image 1

functional interface with Two abstract, default and static method
image 2

You can see in second image, i added another abstract method abstractMethodTwo and it gives error. When you compile second image code it will give following error.
FunctionalInterfaceDemo.java:4: error: Unexpected @FunctionalInterface annotation
        @FunctionalInterface
        ^
  FunctionalInterfaceDemo is not a functional interface
    multiple non-overriding abstract methods found in interface FunctionalInterfaceDemo
1 error

So why we use Functional Interface in java? How they are useful in our code? lets see...

Why use Functional Interface?
Functional Interface are used to create anonymous function using lambda expression.
So, Functional Interface is use lambda expression to provide implement interface without writing boiler-plate code.
 
Some functional interfaces :-

Example 1 : Functional Interface without Lambda expression

FunctionalInterface.java

@FunctionalInterface
public interface FunctionalInterface {
public void abstractMethod();
}


InterfaceImplementClass.java

public class InterfaceImplementClass implements FunctionalInterface{

public void abstractMethod() {
System.out.println("Implementation of Functional Interface Method without 
                         lambda expression");
}

public static void main(String[] args) {
InterfaceImplementClass object = new InterfaceImplementClass();
object.abstractMethod();
}
}

Output :-
Implementation of Functional Interface Method without lambda expression

Example 2 : Functional Interface with lambda expression

InterfaceImplementClass.java

@FunctionalInterface
public interface FunctionalInterface {
    
    // Abstract Method
    public void abstractMethod();
public static void main(String args[]) {
            
                // Functional Interface implementation with lambda expression
FunctionalInterface myInterface = () -> {
System.out.println("Functional Interface 
                                with lambda expression.");
};
myInterface.abstractMethod();
}
}

Output :-
Functional Interface with lambda expression.


We seen how we can use @FunctionalInterface with and without lambda. Now in next demo we will see how to implement FunctionalInterface for two arguments.

Example 3 : Functional Interface with two arguments

@FunctionalInterface
public interface FunctionalInterfaceDemo {

    public void addition(int a, int b);
    
}
 
public class Implementation {

    public static void main(String[] args) {
        
        FunctionalInterfaceDemo obj = (a, b) -> System.out.println("Addition is : " +(a+b));
        obj.addition(10, 10);
    }

}

Output :
Addition is : 20
 

Advantage of Functional Interface

The advantage of making these functional interfaces is that we do not need to create a new class just to implement functional interface, we can provide implementations for the abstract method within these interfaces via lambda expression.
 

Static and Default method in Functional Interface

Example 4 : Static and Default method in Functional Interface

@FunctionalInterface
public interface FunctionalInterfaceDemo {

    public int square(int n);
    
    default void defaultMethod() {
        System.out.println("Default method in Functional Interface");
    }
    
    static void staticMethod() {
        System.out.println("Static method in Functional Interface");
    }
    
}
 
public class Implementation {

    public static void main(String[] args) {
        
        // Implementing square method
        FunctionalInterfaceDemo f = n -> n*n;
        System.out.println("Square of 4 is : " +f.square(4));
        
        // Calling Default method
        f.defaultMethod();
        
        // Calling Static method
        FunctionalInterfaceDemo.staticMethod();
        
    }

}

Output :
Square of 4 is : 16
Default method in Functional Interface
Static method in Functional Interface


@FunctionalInterface vs Inheritance

Lets see some key point use FunctionalInterface with Inheritance
 
Demo 1 :
@FunctionalInterface
public interface InterfaceOne {

    public int methodOne();
    
}

@FunctionalInterface
public interface InterfaceTwo extends InterfaceOne {
    
}
Valid. 
Because InterfaceTwo extends InterfaceOne and that contains one abstract method so, by default available in InterfaceTwo.
 
------------------------------------
 
Demo 2 :
@FunctionalInterface
public interface InterfaceOne {

    public void methodOne();
    
}

@FunctionalInterface
public interface InterfaceTwo extends InterfaceOne {
     
    public void methodOne();
 
}
Valid.
Because InterfaceOne and InterfaceTwo contains same method.

------------------------------------

Demo 3 :
@FunctionalInterface
public interface InterfaceOne {

    public void methodOne();
    
}

@FunctionalInterface
public interface InterfaceTwo extends InterfaceOne {
     
    public void methodTwo();
 
}
Invalid.
Because InterfaceTwo extends InterfaceOne so by default in InterfaceTwo we have one abstract method. And In InterfaceTwo there is another abstract method methodTwo. so it violates @FunctionalInterface rule.  
 
Happy Coding.

Comments

Post a Comment

Popular posts from this blog

Flipping the Matrix HackerRank Solution in Java with Explanation

Java Solution for Flipping the Matrix | Find Highest Sum of Upper-Left Quadrant of Matrix Problem Description : Sean invented a game involving a 2n * 2n matrix where each cell of the matrix contains an integer. He can reverse any of its rows or columns any number of times. The goal of the game is to maximize the sum of the elements in the n *n submatrix located in the upper-left quadrant of the matrix. Given the initial configurations for q matrices, help Sean reverse the rows and columns of each matrix in the best possible way so that the sum of the elements in the matrix's upper-left quadrant is maximal.  Input : matrix = [[1, 2], [3, 4]] Output : 4 Input : matrix = [[112, 42, 83, 119], [56, 125, 56, 49], [15, 78, 101, 43], [62, 98, 114, 108]] Output : 119 + 114 + 56 + 125 = 414 Full Problem Description : Flipping the Matrix Problem Description   Here we can find solution using following pattern, So simply we have to find Max of same number of box like (1,1,1,1). And last

Plus Minus HackerRank Solution in Java | Programming Blog

Java Solution for HackerRank Plus Minus Problem Given an array of integers, calculate the ratios of its elements that are positive , negative , and zero . Print the decimal value of each fraction on a new line with 6 places after the decimal. Example 1 : array = [1, 1, 0, -1, -1] There are N = 5 elements, two positive, two negative and one zero. Their ratios are 2/5 = 0.400000, 2/5 = 0.400000 and 1/5 = 0.200000. Results are printed as:  0.400000 0.400000 0.200000 proportion of positive values proportion of negative values proportion of zeros Example 2 : array = [-4, 3, -9, 0, 4, 1]  There are 3 positive numbers, 2 negative numbers, and 1 zero in array. Following is answer : 3/6 = 0.500000 2/6 = 0.333333 1/6 = 0.166667 Lets see solution Solution 1 import java.io.*; import java.math.*; import java.security.*; import java.text.*; import java.util.*; import java.util.concurrent.*; import java.util.function.*; import java.util.regex.*; import java.util.stream.*; import static java.util.st