Thursday, November 15, 2018

Lambda Expressions in Java 8


Image result for Lambda Expressions in Java 8Lambda Expressions in Java 8

Lambda expressions basically express instances of functional interfaces (An interface with single abstract method is called functional interface. An example is java.lang.Runnable).
Lambda expressions implement the only abstract function and therefore implement functional interfaces.
The major benefit of java 8 functional interfaces is that we can use lambda expressions to instantiate them and avoid using bulky anonymous class implementation.
lambda expressions are added in Java 8 and provide below functionalities.
  • Enable to treat functionality as a method argument, or code as data.
  • A function that can be created without belonging to any class.
  • A lambda expression can be passed around as if it was an object and executed on demand.
Example1:

package com.dev.praticecollection;

//@FunctionalInterface
interface Processor {
     String process(String str);
}

public class LambdaEx {

     public static void main(String[] args) {

           System.out.println(process("Hello World!", str -> str.toUpperCase()));

     }

     private static String process(String str, Processor processor) {
           // TODO Auto-generated method stub
           return processor.process(str);
     }

}



Output:
HELLO WORLD!

Lambda Expressions syntax is (argument) -> (body).
Method reference lets us reuse the pre-existing method definition in
place of lambdas
Equivalent Lambda expression
String::substring
(str,i) ->str.subtring(i)

String::valueOf
number -> String.valueOf(number)

String::new
() -> new String()
(originalString) -> new String (originalString)

someString::concat
(someotherString) -> someString.concat(someotherString)



Example 2:

package com.dev.praticecollection;

import java.util.function.BiFunction;
import java.util.function.Function;

public class LambdaEx2 {

     public static void main(String[] args) {
           String prefix = "MR. ";
           System.out.println(process("Hello World!", String::toUpperCase));
           System.out.println(process2("Hello World!", 5, (str, i) -> str.substring(i)));
           System.out.println(process("Hello World!", prefix::concat));// str -> prefix.concat(str)
     }

     private static String process2(String str, int i, BiFunction<String, Integer, String> processor) {
           // TODO Auto-generated method stub
           return processor.apply(str, i);
     }

     private static String process(String str, Function<String, String> processor) {
           // TODO Auto-generated method stub
           return processor.apply(str);
     }

}


Output:
HELLO WORLD!
 World!
MR. Hello World!

Example 3:

If we try to modify local variable in an enclosing scope.
package com.dev.praticecollection;

import java.util.function.BiFunction;
import java.util.function.Function;

public class LambdaEx2 {

     public static void main(String[] args) {
           String prefix = "MR. ";
           System.out.println(process("Hello World!", String::toUpperCase));
           System.out.println(process2("Hello World!", 5, (str, i) -> str.substring(i)));
           System.out.println(process("Hello World!", str -> {
                prefix="MS ";
                return prefix.concat(str);
           }));// str -> prefix.concat(str)
     }

     private static String process2(String str, int i, BiFunction<String, Integer, String> processor) {
           // TODO Auto-generated method stub
           return processor.apply(str, i);
     }

     private static String process(String str, Function<String, String> processor) {
           // TODO Auto-generated method stub
           return processor.apply(str);
     }

}



Error : Local variable prefix defined in an enclosing scope must be final or effectively final.

Let us try to sort name using comparator without using Lambda expression
Example 4:

package com.dev.praticecollection;

import java.util.Arrays;
import java.util.Comparator;
import java.util.function.Function;

public class LambdaEx3 {

     public static void main(String[] args) {

           String[] names = { "Mr Sanjay", "Ms trupti", "Dr John" };
           Arrays.sort(names, new Comparator<String>() {

                @Override
                public int compare(String name1, String name2) {
                      // TODO Auto-generated method stub
                      return name1.split(" ")[1].compareTo(name2.split(" ")[1]);

                }

           });
           System.out.println(Arrays.toString(names));
     }

     private static String process(String str, Function<String, String> processor) {
           // TODO Auto-generated method stub
           return processor.apply(str);
     }

}


Output:
[Dr John, Mr Sanjay, Ms trupti]

Example 5

Let us try to sort name using comparator with using Lambda expression
package com.dev.praticecollection;

import java.util.Arrays;
import java.util.Comparator;
import java.util.function.Function;

public class LambdaEx4 {

               public static void main(String[] args) {

                              String[] names = { "Mr Sanjay", "Ms trupti", "Dr John" };
                              Arrays.sort(names,(name1, name2) ->
                                             name1.split(" ")[1].compareTo(name2.split(" ")[1])
                                                            );
                              System.out.println(Arrays.toString(names));
               }

               private static String process(String str, Function<String, String> processor) {
                              // TODO Auto-generated method stub
                              return processor.apply(str);
               }

}


Output:
[Dr John, Mr Sanjay, Ms trupti]

Example 6:

In Java 8  has static utility method to compose comparator lambdas expression
package com.dev.praticecollection;

import java.util.Arrays;
import java.util.Comparator;
import java.util.function.Function;

public class LambdaEx5 {

               public static void main(String[] args) {

                              String[] names = { "Mr Sanjay", "Ms trupti", "Dr John" };
                              Arrays.sort(names, Comparator.comparing(name -> name.split(" ")[1])
                              );
                              System.out.println(Arrays.toString(names));
               }

               private static String process(String str, Function<String, String> processor) {
                              // TODO Auto-generated method stub
                              return processor.apply(str);
               }

}

Output:
[Dr John, Mr Sanjay, Ms trupti]

Example 7:

package com.dev.praticecollection;

import java.util.Arrays;
import java.util.Comparator;
import java.util.function.Function;

public class LambdaEx5 {

               public static void main(String[] args) {

                              String[] names = { "Mr Sanjay", "Ms trupti", "Dr John" };
                              Arrays.sort(names, Comparator.comparing(LambdaEx5::firstName)
                              );
                              System.out.println(Arrays.toString(names));
               }
              
               public static String firstName(String name) {
                              return name.split(" ")[1];
               }

               private static String process(String str, Function<String, String> processor) {
                              // TODO Auto-generated method stub
                              return processor.apply(str);
               }

}

Output:
[Dr John, Mr Sanjay, Ms trupti]

Sort the array in reverse order

Example 8:

package com.dev.praticecollection;

import java.util.Arrays;
import java.util.Comparator;
import java.util.function.Function;

public class LambdaEx5 {

               public static void main(String[] args) {

                              String[] names = { "Mr Sanjay", "Ms trupti", "Dr John" };
                              Arrays.sort(names, Comparator.comparing(LambdaEx5::firstName).reversed()
                              );
                              System.out.println(Arrays.toString(names));
               }
              
               public static String firstName(String name) {
                              return name.split(" ")[1];
               }

               private static String process(String str, Function<String, String> processor) {
                              // TODO Auto-generated method stub
                              return processor.apply(str);
               }

}

Output:
[Ms trupti, Mr Sanjay, Dr John]


Example 9:

package com.dev.praticecollection;

import java.util.Arrays;
import java.util.Comparator;
import java.util.function.Function;

public class LambdaEx5 {

               public static void main(String[] args) {

                              String[] names = { "Mr Sanjay", "Ms trupti", "Dr John" };
                              Arrays.sort(names, Comparator.comparing(LambdaEx5::firstName).reversed().thenComparing(LambdaEx5::title )
                              );
                              System.out.println(Arrays.toString(names));
               }
              
               public static String firstName(String name) {
                              return name.split(" ")[1];
               }
              
               public static String title(String name) {
                              return name.split(" ")[0];
               }

               private static String process(String str, Function<String, String> processor) {
                              // TODO Auto-generated method stub
                              return processor.apply(str);
               }

}

Output:
[Ms trupti, Mr Sanjay, Dr John]

0 comments:

Post a Comment