Java 8 Training
Shekhar Gulati
Xebia
@shekhargulati
1
Couple of requests..
Keep your mobile phone in silent mode
Ask questions :)
2
Agenda
Interface static and default methods
Functional paradigm
Lambda expressions
Stream API
Collectors
Optional
Date and Time API
3
Prerequisite
Oracle Java 8 installed on your machine
http://www.oracle.com/technetwork/java/javase/
downloads/index-jsp-138363.html
Exact Version -> Java SE 8u60
IntelliJ Idea Community Edition (or Eclipse Mars)
https://www.jetbrains.com/idea/download/
http://www.eclipse.org/downloads/packages/eclipse-ide-
java-developers/marsr
Git
4
Why languages
evolve?
5
Why languages evolve?
To meet developers expectations
To remain relevant
To keep up-to-date with hardware
advancements
Security fixes
Better approaches to perform certain task
6
Why you should learn Java 8?
To embrace functional programming paradigm
Lambdas
Declarative data processing
New and improved API’s
Date and Time API
Stream API
Concurrency utilities
Improved support for clean API design
Optional
Interface default and static methods
7
Section 01
Interface API Design
8
Three main components of API Design
Interfaces
Abstract Classes
Classes
9
Let’s write a simple Calculator
Calculator >> Interface
BasicCalculator >> Implementation
10
Static methods
Allow API designer to define static
methods inside an interface
for defining static utility methods
11
Static method example
12
Interfaces can now have
static and default(instance)
methods
13
Why we need this?
Ability to evolve API with time
Remain source compatible
14
Demo >>
Evolving API’s
15
Default Methods
Interfaces can supply non-abstract
methods
Enables interfaces to evolve with time
Eliminate need for companion or utility
classes
16
Example of default method
Iterable’s forEach method
17
Multiple inheritance
With interfaces having the capability to
define methods, we have behaviour level
multiple interfaces
18
Interface Class Hierarchy
19
Multiple Interface Hierarchy
20
Diamond problem
21
Section 02
Functional Paradigm
22
Programming paradigm
A programming paradigm is a fundamental
style of computer programming.
Imperative, declarative, functional,
object-oriented, procedural, logical, etc.
A programming language can follow one
or more paradigms.
23
Imperative vs Functional Paradigm
Imperative programming paradigm
- Computation: Uses statements that change a program’s state.
- Program: Consists of sequence of commands that tell a
program how it should achieve the result.
Functional programming paradigm
- Computation: Evaluation of expressions
- Expression: Formed by using functions to combine basic values.
- Focusses on what the program should accomplish rather than
how
Examples on
24
next page
Canonical example — Factorial
Imperative style >>
Functional style >>
Scala >>
Functional Programming
Functional programming was invented in
1957
Before Object Oriented programming
Before structured programming
Memory was too expensive to make
functional programming practical
26
Functional programming
“Functional programming is so called
because a program consists entirely of
functions.”
- John Hughes, Why Functional Programming Matters
27
What is a function?
A side effect free computation that always
result in same value when passed with
same argument.
28
Why should we embrace functional
programming?
Functional programs are simpler
No side effects
Fewer concurrency issues
29
Moore’s law ran out!!
30
Functional Languages
Haskell
ML
Erlang
F# - (Hybrid)
Scala - (Hybrid)
Clojure
Java 8 - (Hybrid)
31
Key Functional Programming Concepts
Function
A side effect free computation that always result in same value when passed
with same argument.
Higher order function
function that takes function as argument or return functions.
Referential transparency
allows you to replace function with its value
Recursion
function calls itself
Lazy evaluation
function is not evaluated until required
32
Introduce Example Domain
Task management application
Task
TaskType
33
SECTION 03
LAMBDAS
34
Lambda expression
A new feature introduced in Java 8
A representation of anonymous function that can be
passed around.
Allows you to pass behaviour as code that can be
executed later
Allows you to encapsulate changing behaviour in a
lambda expression
Earlier this was achieved via the use of anonymous
inner classes
35
Demo >> lambda
Example 1
36
Lambda expression
The (first, second) are parameters of the
compare method
first.length() - second.length() is the
function body
-> is the lambda operator
37
Lambda syntax
- (String a, String b) -> {return a + b;}
- (a,b) -> a + b
- a -> a*a
- () -> a
- () -> {System.out.println(“hello world”);}
38
Type Inference
The act of inferring a type from context is called
Type Inference.
In most cases, javac will infer the type from
context.
If it can’t resolve then compiler will throw an error.
Demo >> Example2_Lambda
39
Lambdas are Typed
Type of a lambda expression is an interface
Only interfaces with single abstract method
can be used
These interfaces are called functional
interfaces
You can use @FunctionalInterface annotation
to mark your interface a functional interface
40
Example @FuntionalInterface
Demo >> Example3_Functionalnterfaces.java
41
Invalid @FunctionalInterface
42
Look at few @FunctionalInterface
Most of the time you don’t have to write your
own @FunctionalInterface
You can leverage interfaces defined in
java.util.function package
Some shown below:
43
Test your lambda
knowledge
>> Exercise1_Lambda.java
44
Where can I use lambda expression?
You can use lambdas wherever you use an
interface with single method
Some examples callbacks, comparisons,
filtering, transformation, actions,etc.
Spring templates are example where lambda could be
used
45
Using local variables >> Effective final
46
Method References
47
Method reference
Lets you create lambda expression from
existing method implementation
Shorthand for lambdas calling only a
specific method
String str -> str.length()
String::length
48
Demo >>
Method Reference
49
Exercise >> Let’s apply what we have learnt so far
50
SECTION 04
STREAM PROCESSING
51
Stream Processing
Why we need a new data processing
abstraction?
Stream vs Collection
Using Stream API
52
Why?
Collection API is too low level
Developers needed a higher level
declarative data processing API
Processing data in parallel
53
Data processing before Java 8
What does this code do?
54
Data processing in Java 8
Isn’t this code beautiful?
55
Understanding the code
56
Why Java 8 code is better?
Developer’s intent is clear
Declarative >> What over How
Reusable chainable higher level construct
Unified language for data processing
No boilerplate code.!! Yay :)
57
Stream
Stream is a sequence of elements from a
source supporting data processing
operations
source -> collection with elements
data processing operations -> filter, map,
etc.
58
Collection vs Stream
Collection Stream
Only read operations. You can’t
Read and write operation
add or remove elements.
Eagerly evaluated Lazily evaluated
Streams are for performing
Collections are about data
computations on data
Client has to iterate over
internal iteration
collection >> External iteration
You can iterate over collection You can only process a stream
multiple times once
59
Stream API
60
Stream operations
Intermediate operations >> which results in
another stream
map, filter, sort, distinct, etc
Terminal operations >> which produce a
non-stream result
collect, foreach,
61
filtering
Demo >> Example2_FilterStream
62
Filtering operations
Find all the reading tasks sorted by their
creation date
Find all distinct tasks and print them
Find top 5 reading tasks sorted by their
creation date
Pagination with Skip and Limit
Count all reading tasks
63
map operation
Example3_MapStreams
64
flatmap operation
65
reduce operation
66
Duplicate Elements in a List
Output >>
Duplicate Elements n times in a List
Output >>
Working with numeric streams
IntStream
LongStream
DoubleStream
69
Parallel Stream
You can create an instance of parallel
stream by calling the parallel operator
70
SECTION 05
COLLECTORS
71
Collector
Reduce a stream to a single value
collect is a reduction operation
They are used with collect terminal
method
72
Demo >>
Power of Collector
Group tasks by Type >> Java 7 and Java 8
73
What you can do with collect?
Reducing stream to a single value
Group elements in a stream
Partition elements in a stream
74
Collectors class
A utility class that contains static factory
methods for most common collectors
that collect to a Collection
grouping
partitioning
75
Reducing to a single value
Single value could be
numeric type
domain object
a collection
Demo >> Example2_ReduceValue
76
Grouping elements
Group elements by key
You can do both single level and
multilevel grouping
Demo >> Example3
77
Partitioning
It is a special case of grouping
Groups source collection into at most two
partitioned by a predicate
Returned map has following syntax
Map<Boolean, List<Task>>
Demo >> Example4
78
Sec 06
Optional<T>
79
How many of you
have experienced
NullPointerException?
80
Null History
It was designed by Sir Tony Hoare in 1965
creator of Quicksort
He was designing Algol W language
null was designed to signify absence of value
Most programming languages like Java, C++, C#,
Scala, etc all have Null
He called it was a Billion Dollar Mistake
http://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-
Hoare
What could possibly go wrong?
82
NullPointerException
83
We end up writing …
84
Biggest problem with code
Absence of value is not visible in the API
85
Possible solutions
Null Object Pattern << Before Java 8
Optional << From Java 8
86
Optional
A container that may or may not contain a value
If a function returns Optional then the client
would know that value might not be present
Common concept is functional languages
MayBe, Nothing >> Haskell
Option, Some, None >> Scala
Optional<T> >> Java 8
87
Demo >>
Optional TaskRepository
88
Another Example
89
SECTION 07
DATE AND TIME API
90
What does the below program prints?
91
Existing Date API Problems
Sun Jan 12 00:00:00 IST 1913
Which 12 is for date field?
12 is for December right?? No. It’s January
Year 12 is 12 CE?? Wrong 1913.. starts from 1900
Hmmm. why there is time in date??
There is timezone as well?? Who asked??
92
Existing Date API
Date API was introduced in JDK in 1996
There are many issues with
Mutability
Date is not date but date with time
Separate Date class hierarchy for SQL
No concept of timezone
Boilerplate friendly
93
Calendar API
Still mutable
Can’t format a date directly
You can’t perform arithmetic operations on
date.
Calendar instance does not work with
formatter
94
New API — Getting Started
Developed as part of JSR 310
Heavily inspired by Joda-Time library
New package — java.time
95
New types for humans
LocalDate - a date with no time or
timezone
LocalTime - a time with no date or
timezone
LocalDateTime - LocaDate + LocalTime
All types are immutable
96
Demo >>
LocalDate, LocalTime, and
LocalDateTime
97
New Type >> Instant
A machine friendly way to describe date
and time
Number of seconds passed since epoch
time
Nanosecond precision
Useful to represent event timestamp
98
Demo >> Instant
99
Duration and Period
Duration represents quantity or amount of
time in seconds or nano-seconds like 10
seconds
Duration d = Duration.between(dt1,dt2)
Period represents amount or quantity of
time in years, months, and days
Period p = Period.between(ld1,ld2)
100
Demo >>
101
Temporal Adjuster
When you need to do advance date-time
manipulation then you will use it
Examples
adjust to next sunday
adjust to first day of next month
adjust to next working day
102
Demo >>
103
Thanks
https://github.com/shekhargulati/java8-the-
missing-tutorial
https://twitter.com/shekhargulati
104