Lambda expressions in Java 8 :
Lambda expressions are introduced in Java 8. There are various reasons why lambda expression was added . I will try to explain you with a simple example how the code is without lambda expression and how it can be changed using lambda expression :
In this exmaple we will have :
- 
One model class Car with one String property color
 - 
One interface ICarChecker with a function called public boolean isValidColor(Car car). It will check if a car is valid or not .
 - 
An adapter CarCheckerAdapter that implements ICarChecker and checks for a valid color. If color is white then it is valid.
 
Following are the classes we have mentioned above :
Car.java
public class Car {
    String color;
    public Car (String colorType){
        color = colorType;
    }
    public String getColor() {
        return color;
    }
}
Interface ICarChecker.java
public interface ICarChecker {
    public boolean isValidColor(Car car);
}
Adapter CarCheckerAdapter.java
public class CarCheckerAdapter implements ICarChecker{
    @Override
    public boolean isValidColor(Car car) {
        return car.getColor().equalsIgnoreCase("white");
    }
}
Main class Main.java
public class Main {
    public static void main(String[] args){
        Car audi = new Car("white");
        Car bmw = new Car("black");
        CarCheckerAdapter adapter = new CarCheckerAdapter(){
            @Override
            public boolean isValidColor(Car car) {
                return super.isValidColor(car);
            }
        };
        System.out.println("Color of Audi checker result : "+adapter.isValidColor(audi));
        System.out.println("Color of bmw checker result : "+adapter.isValidColor(bmw));
    }
}
In this example, to check if a color is valid or not , we need to create one Anonymous class CarCheckerAdapter each time. Using lambda expression, we can remove this problem.Let’s see :
What is a Lambda Expression :
The syntax of lambda expression can be defined as below :
(argument) -> {body}- 
argument is the argument we are passing. It can be empty or non-empty. For single parameter , parenthesis are optional.
 - 
body contains the statements of the lambda expression. For one statement body, curly braces are optional, also return statement is optional.
 - 
The type of the arguments is optional to mention, if not mentioned compiler will identify it.
 - 
Lambda expression can also be used with Functional Interface , i.e. interface with only one method declaration.
 
Using Lambda expression to our above example :
In our above example, we can convert our Anonymous class to lambda expression as ICarChecker is a functional interface.Our Main.java will look like :
public class Main {
    public static void main(String[] args){
        Car audi = new Car("white");
        Car bmw = new Car("black");
        ICarChecker adapter = (Car car) -> {return car.getColor().equalsIgnoreCase("white");};
        System.out.println("Color of Audi checker result : "+adapter.isValidColor(audi));
        System.out.println("Color of bmw checker result : "+adapter.isValidColor(bmw));
    }
}
Instead of creating a new Adapter class and implement the interface, we have done these using only one line.
Since we have only one argument and one expression in the body with a return statement. So, as mentioned above, this lambda expression can be simplified as below :
ICarChecker adapter = car -> car.getColor().equalsIgnoreCase("white");
All these three examples will produce the same output .
Using Lambda expression with Thread and Comparator :
In this example, we will use lambda expression for Runnable to create a thread and inside this thread we will use lambda expression again with Comparator to sort one arraylist using Collections.sort method.
We are using the same example as above . Change Main.java as below :
import java.util.ArrayList;
import java.util.Collections;
public class Main {
    public static void main(String[] args){
        //1
        Car audi = new Car("white");
        Car bmw = new Car("black");
        Car bentley = new Car("red");
        Car bugatti = new Car("blue");
        Car jaguar = new Car("green");
        //2
        ArrayList carList = new ArrayList<>();
        carList.add(audi);
        carList.add(bmw);
        carList.add(bentley);
        carList.add(bugatti);
        carList.add(jaguar);
        System.out.println("Before sorting ...");
        for (Car c : carList){
            System.out.println("Car colour : "+c.getColor());
        }
        //3
        Thread sortingThread = new Thread(()->{
            Collections.sort(carList,(car1,car2) -> car1.getColor().compareTo(car2.getColor()));
            System.out.println("After sorting...");
            for (Car c : carList){
                System.out.println("Car colour : "+c.getColor());
            }
        });
        sortingThread.start();
    }
}
Explanation :
- 
Create 5 Car models with different colors. We are going to sort these models on ascending order as its color name.
 - 
Add all these models in a arraylist carList
 - 
Since Runnable is a functional interface, we can use Lambda expression here . Instead of writing :
 
 Runnable runnable=new Runnable(){
            public void run(){
               //sorting code
            }
        };
I have wrote :
()->{ }And inside the curly braces sorting is done.
Similarly , the method ’compare’ of ’Comparator’ takes two arguments, we are using (car1,car2) -> {} to replace it. This program will look like below without using lambda expression :
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Main {
    public static void main(String[] args){
        Car audi = new Car("white");
        Car bmw = new Car("black");
        Car bentley = new Car("red");
        Car bugatti = new Car("blue");
        Car jaguar = new Car("green");
        ArrayList carList = new ArrayList<>();
        carList.add(audi);
        carList.add(bmw);
        carList.add(bentley);
        carList.add(bugatti);
        carList.add(jaguar);
        System.out.println("Before sorting ...");
        for (Car c : carList){
            System.out.println("Car colour : "+c.getColor());
        }
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                Comparator comparator = new Comparator() {
                    @Override
                    public int compare(Car car1, Car car2) {
                        return car1.getColor().compareTo(car2.getColor());
                    }
                };
                Collections.sort(carList,comparator);
                System.out.println("After sorting...");
                for (Car c : carList){
                    System.out.println("Car colour : "+c.getColor());
                }
            }
        };
        Thread sortingThread = new Thread(runnable);
        sortingThread.start();
    }
}
Similar tutorials :
- Java program to rotate each words in a string
 - Java program to convert string to byte array and byte array to string
 - Java program to replace string in a file
 - Java program to count the occurrence of each character in a string
 - How to convert a boolean to string in Java
 - How to compare Substrings in Java using regionMatches
 

