Java 8 Features

Java 8 Features

24 September 2021

Why Java 8 ?

  • Most popular and widely accepted language in the world.
  • Java wanted to introduce features such as:
    • Lambdas
    • Streams
    • Optional and etc.,
  • Technological advancements with the mobile/laptops/systems.
  • Java 8 features simplify the concurrency operations.

Functional Programming:

  • Embraces creating Immutable objects.
  • More concise and readable code.
  • Using functions/methods as first class citizens.
  • Example: Function addSomeString = (name) -> name.toUpperCase().concat(“default”);

What is Lambda Expression?

  • Lambda is just like a function (method) without a name.
  • Lambda’s are also referred to as Anonymous functions.
    • Method parameters
    • Method Body
    • Return Type
  • Lambdas are not bound to any class like a normal method.
  • Lambda can also be stored by variables and passed around.
  • Syntax of the Lambda Expression: Lambda Expression: ( ) -> { }
    • (): Lambda Body Input Parameter
    • ->: Lambda Arrow
    • { } : Lambda Body

Usages of Lambda

  • Lambda is most importantly used to implement the Functional Interfaces(SAM).
  • @FunctionalInterface public interface Comparator { int compare(T1 a1, T2 a2);
  • @FunctionalInterface public interface Runnable { public abstract void run(); }

Let’s code our first Lambda!

  • Implement Runnable using Lambda
  • Lambda in Practice
    • ( Things to keep in Mind) ( ) -> Single Statement or Expression; //curly braces are not needed.
    • ( )-> { }; // curly braces are needed for multiple //statements
  • @FunctionalInterface public interface Runnable { public abstract void run(); }
  • Lambdas vs Legacy Java(until Java7)
  • Legacy:
    • Runnable run = new Runnable() { @Override public void run() { System.out.println(“Inside Run 1”); } };
  • Java 8:
    • Runnable runLambda = () -> {System.out.println(“Inside Run 2”);};

Functional Interfaces

  • Exists since Java 1.0
  • Definition: A Functional Interface(SAM) is an interface that has exactly one abstract method.
  • @FunctionalInterface: This annotation is introduced as part of the JDK 1.8.
  • Optional annotation to signify an interface as Functional Interface.

New Functional Interfaces in Java8

  • Consumer – IntConsumer, DoubleConsumer, LongConsumer
  • Predicate – IntPredicate, BiPredicate, LongPredicate
  • Function – IntFunction, DoubleFunction, LongFunction,IntToDoubleFunction, IntoLongFunction,DoubletoIntFunction, DoubletoLongFunction,LongtoIntFunction, LongtoDoubleFunction,ToIntFunction, ToDoubleFunction,ToLongFunction
  • Supplier – IntSupplier, LongSupplier, DoubleSupplier, BooleanSupplier

Method Reference

  • Introduced as part of Java 8 and its purpose is to simplify the implementation of Functional Interfaces.
  • Shortcut for writing the Lambda Expressions.
  • Refer a method in a class

Syntax of Method Reference

  • ClassName::instance-methodName
  • ClassName::static-methodName
  • Instance::methodName

Where to use Method Reference?

  • Lambda expressions referring to a method directly.
  • Using Lambda: Function toUpperCaseLambda = (s)->s.toUpperCase();
  • Using Method Reference:
    • Function toUpperCaseMethodRefernce = String::toUpperCase;

Where Method Reference is not Applicable ?

  • Example: Predicate predicateUsingLambda = (s) -> s.getGradeLevel()>=3;
  • Constructor Reference
  • Introduced as part of Java 1.8
  • Syntax: Classname::new
  • Example:
    • Supplier studentSupplier = Student::new;
    • Invalid: Student student = Student::new; // compilation issue

Lambdas and Local Variables

  • What is a Local variable ?
  • Variables that are declared inside a method are called local variables.
  • Lambda Functions have some restrictions on using the local variables:
  • Not allowed to use the same local variable name as lambda parameters or inside the lambda body.
  • Not allowed to re-assign a value to a local variable.
  • No restrictions on instance variables.

Introduction to Streams API:

  • Introduced as part of Java8
  • Main purpose is to perform some operations on Collections.
  • Parallel operations are easy to perform with Streams API without having to spawn multiple threads.
  • Streams API can be also used with arrays or any kind of I/O.

What is a Stream ?

  • Stream is a sequence of elements which can be created out of a collections such as List or Arrays or any kind of I/O resources and etc.,
    • List names = Arrays.asList(“adam”,”dan”,”jenny”); names.stream(); // creates a stream
  • Stream operations can be performed either sequentially or parallel. Names.
    • parallelStream(); // creates a parallel stream

Collections and Streams

  • Collections
    • Can add or modify elements at any point of time.
    • For Example: List -> list.add()
    • Elements in the collection can be accessed in any order. Use appropriate methods based on the collection. For Example: List -> list.get(4);
    • Collection is eagerly constructed.
    • Collections can be traversed “n” number of times.
    • Collections operate External Iteration to iterate through the elements.
  • Streams
    • Cannot add or modify elements in the stream. It is a fixed data set.
    • Elements in the Stream can be accessed only in sequence.
    • Streams are lazily constructed.
    • Streams can be traversed only once.
    • Streams operate Internal Iteration to iterate through the elements.

search

Blog Categories

Request a quote