Functional Interface in Java
Functional Interface is defined as an interface with only one abstract method.one of the example of Functional interface in java.lang package is Runnable with only one abstract method run().we can use Annotation , @FunctionalInterface to create Functional interface in java , actually this annotation is not mandatory , but if we write this annotation , and in future if somebody try to add new abstract method in our interface then he will get Error as : Invalid '@FunctionalInterface' annotation.Functional Interfaces are also called as Single Abstract Method(SAM) interfaces.
Using Functional Interfaces,Anonymous Inner classes are implemented.
Example :
public class TestAnonymousInnerClass {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Implementing Runnable");
}
}).start();
}
}
Output :
Implementing Runnable
Lambda Expressions in java
Lambda Expression is used to implement Functional Interface ,
Syntax for lambda :
(parameters)->{statements};
Example :
1.(int a,int b) -> a+b;
2.(a,b) -> a-b;
3.() -> 12;
4.(String msg) -> System.out.println(msg);
5.(a,b) -> {
System.out.println("Addition is "+(a+b));
System.out.println("Subtraction is "+(a-b));
};
Example :
public class TestLambdaExpression {
public static void main(String[] args) {
Runnable r1 = () -> {
System.out.println("Using Lambda Thread 1");
};
new Thread(r1).start();
Thread t2 = new Thread(() -> {
System.out.println("Using Lambda Thread 2");
});
t2.start();
new Thread(() -> {
System.out.println("Using Lambda Thread 3");
}).start();
}
}
Output :
Using Lambda Thread 1
Using Lambda Thread 2
Using Lambda Thread 3
Note - There can be N number of default and static method but only one abstract method in functional interface. Example of Functional Interface in java :
@FunctionalInterface
interface StudentAction{
void act(String s);
}
public class TestLambdaExpression {
public static void main(String[] args) {
StudentAction studentAction=(s)->System.out.println(s);
studentAction.act("visit crtr4u.com");
studentAction.act("learn code");
studentAction.act("do pratice");
studentAction.act("get job");
}
}
Output :
visit crtr4u.com
learn code
do pratice
get job
Here is one more example , using lambda expression , try to understand it and practice :Example :Functional Interface in java :
Step 1: Write 4 functional interfaces as below :Understand above code and execute it , happy learning.@FunctionalInterface interface AdditionInterface{ int add(int a,int b); } @FunctionalInterface interface SubtractionInterface{ int subtract(int a,int b); } @FunctionalInterface interface MultiplicationInterface{ int multiply(int a,int b); } @FunctionalInterface interface DivisionInterface{ int divide(int a,int b); }
Step 2: Write MyUtility class as below :class MyUtility{ void perform(Object obj,int num1,int num2){ if(obj instanceof AdditionInterface){ System.out.println("Addition is :"+((AdditionInterface)obj).add(num1, num2)); } else if(obj instanceof SubtractionInterface){ System.out.println("Subtraction is :"+((SubtractionInterface)obj).subtract(num1, num2)); } else if(obj instanceof MultiplicationInterface){ System.out.println("Multiplication is :"+((MultiplicationInterface)obj).multiply(num1, num2)); } else if(obj instanceof DivisionInterface){ System.out.println("Division is :"+((DivisionInterface)obj).divide(num1, num2)); } else { System.out.println("Action is Unknown"); } } }
Step 3: Write Main class as below and execute it :public class TestLambdaExpression { public static void main(String[] args) { AdditionInterface add=(a,b)->a+b; SubtractionInterface subtract=(a,b)->a-b; MultiplicationInterface multiply=(a,b)->a*b; DivisionInterface divide=(a,b)->a/b; MyUtility myUtility=new MyUtility(); myUtility.perform(add, 9, 3); myUtility.perform(subtract, 9, 3); myUtility.perform(multiply, 9, 3); myUtility.perform(divide, 9, 3); } }
Output : Addition is :12 Subtraction is :6 Multiplication is :27 Division is :3