SlideShare a Scribd company logo
Lambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon Ritter
Lambdas 
& 
Streams 
In 
JDK8 
Making 
Bulk 
Opera/ons 
Simple 
Simon 
Ri6er 
Head 
of 
Java 
Technology 
Evangelism 
Oracle 
Corp. 
Twi6er: 
@speakjava 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved.
Safe 
Harbor 
Statement 
The 
following 
is 
intended 
to 
outline 
our 
general 
product 
direcTon. 
It 
is 
intended 
for 
informaTon 
purposes 
only, 
and 
may 
not 
be 
incorporated 
into 
any 
contract. 
It 
is 
not 
a 
commitment 
to 
deliver 
any 
material, 
code, 
or 
funcTonality, 
and 
should 
not 
be 
relied 
upon 
in 
making 
purchasing 
decisions. 
The 
development, 
release, 
and 
Tming 
of 
any 
features 
or 
funcTonality 
described 
for 
Oracle’s 
products 
remains 
at 
the 
sole 
discreTon 
of 
Oracle. 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
3
java.util.concurrent 
(jsr166) 
1.0 5.0 6 7 8 
1996 … 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
java.lang.Thread 
Fork/Join 
Framework 
(jsr166y) 
Concurrency 
in 
Java 
Project 
Lambda 
Phasers, 
etc 
(jsr166)
Lambdas 
In 
Java 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved.
The 
Problem: 
External 
IteraTon 
List<Student> 
students 
= 
... 
double 
highestScore 
= 
0.0; 
for 
(Student 
s 
: 
students) 
{ 
if 
(s.getGradYear() 
== 
2011) 
{ 
if 
(s.getScore() 
> 
highestScore) 
highestScore 
= 
s.score; 
} 
} 
• Our 
code 
controls 
iteraTon 
• Inherently 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
serial: 
iterate 
from 
beginning 
to 
end 
• Not 
thread-­‐safe 
• Business 
logic 
is 
stateful 
• Mutable 
accumulator 
variable
Internal 
IteraTon 
With 
Inner 
Classes 
• IteraTon 
handled 
by 
the 
library 
• Not 
inherently 
serial 
– 
traversal 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
may 
be 
done 
in 
parallel 
• Traversal 
may 
be 
done 
lazily 
– 
so 
one 
pass, 
rather 
than 
three 
• Thread 
safe 
– 
client 
logic 
is 
stateless 
• High 
barrier 
to 
use 
– SyntacTcally 
ugly 
More 
FuncTonal 
double 
highestScore 
= 
students 
.filter(new 
Predicate<Student>() 
{ 
public 
boolean 
op(Student 
s) 
{ 
return 
s.getGradYear() 
== 
2011; 
} 
}) 
.map(new 
Mapper<Student,Double>() 
{ 
public 
Double 
extract(Student 
s) 
{ 
return 
s.getScore(); 
} 
}) 
.max();
Internal 
IteraTon 
With 
Lambdas 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
List<Student> 
students 
= 
... 
double 
highestScore 
= 
students 
.filter(Student 
s 
-­‐> 
s.getGradYear() 
== 
2011) 
.map(Student 
s 
-­‐> 
s.getScore()) 
.max(); 
• More 
readable 
• More 
abstract 
• Less 
error-­‐prone 
NOTE: 
This 
is 
not 
JDK8 
code
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
Lambda 
Expressions 
Some 
Details 
• Lambda 
expressions 
represent 
anonymous 
funcTons 
– Same 
structure 
as 
a 
method 
• typed 
argument 
list, 
return 
type, 
set 
of 
thrown 
excepTons, 
and 
a 
body 
– Not 
associated 
with 
a 
class 
• We 
now 
have 
parameterised 
behaviour, 
not 
just 
values 
double 
highestScore 
= 
students. 
filter(Student 
s 
-­‐> 
s.getGradYear() 
== 
2011). 
map(Student 
s 
-­‐> 
s.getScore()) 
max(); 
What 
How
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
Lambda 
Expression 
Types 
• Single-­‐method 
interfaces 
are 
used 
extensively 
in 
Java 
– DefiniTon: 
a 
func2onal 
interface 
is 
an 
interface 
with 
one 
abstract 
method 
– Func2onal 
interfaces 
are 
idenTfied 
structurally 
– The 
type 
of 
a 
lambda 
expression 
will 
be 
a 
func2onal 
interface 
• Lambda 
expressions 
provide 
implementaTons 
of 
the 
abstract 
method 
interface 
Comparator<T> 
{ 
boolean 
compare(T 
x, 
T 
y); 
} 
interface 
FileFilter 
{ 
boolean 
accept(File 
x); 
} 
interface 
Runnable 
{ 
void 
run(); 
} 
interface 
ActionListener 
{ 
void 
actionPerformed(…); 
} 
interface 
Callable<T> 
{ 
T 
call(); 
}
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
Local 
Variable 
Capture 
• Lambda 
expressions 
can 
refer 
to 
effec2vely 
final 
local 
variables 
from 
the 
enclosing 
scope 
• EffecTvely 
final: 
A 
variable 
that 
meets 
the 
requirements 
for 
final 
variables 
(i.e., 
assigned 
once), 
even 
if 
not 
explicitly 
declared 
final 
• Closures 
on 
values, 
not 
variables 
void 
expire(File 
root, 
long 
before) 
{ 
root.listFiles(File 
p 
-­‐> 
p.lastModified() 
<= 
before); 
}
What 
Does 
‘this’ 
Mean 
For 
Lambdas? 
• ‘this’ 
refers 
to 
the 
enclosing 
object, 
not 
the 
lambda 
itself 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
• Think 
of 
‘this’ 
as 
a 
final 
predefined 
local 
• Remember 
the 
Lambda 
is 
an 
anonymous 
func2on 
– It 
is 
not 
associated 
with 
a 
class 
– Therefore 
there 
can 
be 
no 
‘this’ 
for 
the 
Lambda
Referencing 
Instance 
Variables 
Which 
are 
not 
final, 
or 
effecTvely 
final 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
class 
DataProcessor 
{ 
private 
int 
currentValue; 
public 
void 
process() 
{ 
DataSet 
myData 
= 
myFactory.getDataSet(); 
dataSet.forEach(d 
-­‐> 
d.use(currentValue++)); 
} 
}
Referencing 
Instance 
Variables 
The 
compiler 
helps 
us 
out 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
class 
DataProcessor 
{ 
private 
int 
currentValue; 
public 
void 
process() 
{ 
DataSet 
myData 
= 
myFactory.getDataSet(); 
dataSet.forEach(d 
-­‐> 
d.use(this.currentValue++); 
} 
} 
‘this’ 
(which 
is 
effecTvely 
final) 
inserted 
by 
the 
compiler
static 
T 
void 
sort(List<T> 
l, 
Comparator<? 
super 
T> 
c); 
List<String> 
list 
= 
getList(); 
Collections.sort(list, 
(String 
x, 
String 
y) 
-­‐> 
x.length() 
-­‐ 
y.length()); 
Collections.sort(list, 
(x, 
y) 
-­‐> 
x.length() 
-­‐ 
y.length()); 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
Type 
Inference 
• The 
compiler 
can 
oien 
infer 
parameter 
types 
in 
a 
lambda 
expression 
§ Inferrence 
based 
on 
the 
target 
funcTonal 
interface’s 
method 
signature 
• Fully 
staTcally 
typed 
(no 
dynamic 
typing 
sneaking 
in) 
– More 
typing 
with 
less 
typing
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
Method 
References 
• Method 
references 
let 
us 
reuse 
a 
method 
as 
a 
lambda 
expression 
FileFilter 
x 
= 
File 
f 
-­‐> 
f.canRead(); 
FileFilter 
x 
= 
File::canRead;
Factory<List<String>> 
f 
= 
() 
-­‐> 
return 
new 
ArrayList<String>(); 
Replace 
with 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
Constructor 
References 
• Same 
concept 
as 
a 
method 
reference 
– For 
the 
constructor 
Factory<List<String>> 
f 
= 
ArrayList<String>::new;
Library 
EvoluTon 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved.
int 
heaviestBlueBlock 
= 
blocks 
.filter(b 
-­‐> 
b.getColor() 
== 
BLUE) 
.map(Block::getWeight) 
.reduce(0, 
Integer::max); 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
Library 
EvoluTon 
Goal 
• Requirement: 
aggregate 
operaTons 
on 
collecTons 
– New 
methods 
required 
on 
CollecTons 
to 
facilitate 
this 
• This 
is 
problemaTc 
– Can’t 
add 
new 
methods 
to 
interfaces 
without 
modifying 
all 
implementaTons 
– Can’t 
necessarily 
find 
or 
control 
all 
implementaTons
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
SoluTon: 
Default 
Methods 
• Specified 
in 
the 
interface 
• From 
the 
caller’s 
perspecTve, 
just 
an 
ordinary 
interface 
method 
• Provides 
a 
default 
implementaTon 
• Default 
only 
used 
when 
implementaTon 
classes 
do 
not 
provide 
a 
body 
for 
the 
extension 
method 
• ImplementaTon 
classes 
can 
provide 
a 
be6er 
version, 
or 
not 
interface 
Collection<E> 
{ 
default 
Stream<E> 
stream() 
{ 
return 
StreamSupport.stream(spliterator()); 
} 
}
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
Virtual 
Extension 
Methods 
Stop 
right 
there! 
• Err, 
isn’t 
this 
implemenTng 
mulTple 
inheritance 
for 
Java? 
• Yes, 
but 
Java 
already 
has 
mulTple 
inheritance 
of 
types 
• This 
adds 
mulTple 
inheritance 
of 
behavior 
too 
• But 
not 
state, 
which 
is 
where 
most 
of 
the 
trouble 
is 
• Can 
sTll 
be 
a 
source 
of 
complexity 
• Class 
implements 
two 
interfaces, 
both 
of 
which 
have 
default 
methods 
• Same 
signature 
• How 
does 
the 
compiler 
differenTate? 
• StaTc 
methods 
also 
allowed 
in 
interfaces 
in 
Java 
SE 
8
FuncTonal 
Interface 
DefiniTon 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
• Single 
Abstract 
Method 
(SAM) 
type 
• A 
funcTonal 
interface 
is 
an 
interface 
that 
has 
one 
abstract 
method 
– Represents 
a 
single 
funcTon 
contract 
– Doesn’t 
mean 
it 
only 
has 
one 
method 
• @FunctionalInterface 
annotaTon 
– Helps 
ensure 
the 
funcTonal 
interface 
contract 
is 
honoured 
– Compiler 
error 
if 
not 
a 
SAM
Lambdas 
In 
Full 
Flow: 
Streams 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved.
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
Aggregate 
OperaTons 
• Most 
business 
logic 
is 
about 
aggregate 
operaTons 
– “Most 
profitable 
product 
by 
region” 
– “Group 
transacTons 
by 
currency” 
• As 
we 
have 
seen, 
up 
to 
now, 
Java 
uses 
external 
iteraTon 
– Inherently 
serial 
– FrustraTngly 
imperaTve 
• Java 
SE 
8’s 
answer: 
The 
Stream 
API 
– With 
help 
from 
Lambdas
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
Stream 
Overview 
At 
The 
High 
Level 
• AbstracTon 
for 
specifying 
aggregate 
computaTons 
– Not 
a 
data 
structure 
– Can 
be 
infinite 
• Simplifies 
the 
descripTon 
of 
aggregate 
computaTons 
– Exposes 
opportuniTes 
for 
opTmisaTon 
– Fusing, 
laziness 
and 
parallelism
Source 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
Stream 
Overview 
• A 
stream 
pipeline 
consists 
of 
three 
types 
of 
things 
– A 
source 
– Zero 
or 
more 
intermediate 
operaTons 
– A 
terminal 
operaTon 
• Producing 
a 
result 
or 
a 
side-­‐effect 
Pipeline 
int 
total 
= 
transactions.stream() 
.filter(t 
-­‐> 
t.getBuyer().getCity().equals(“London”)) 
.mapToInt(Transaction::getPrice) 
.sum(); 
Intermediate 
operaTon 
Terminal 
operaTon
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
Stream 
Sources 
Many 
Ways 
To 
Create 
• From 
collecTons 
and 
arrays 
– Collection.stream() 
– Collection.parallelStream() 
– Arrays.stream(T 
array) 
or 
Stream.of() 
• StaTc 
factories 
– IntStream.range() 
– Files.walk() 
• Roll 
your 
own 
– java.util.Spliterator
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
Stream 
Sources 
Provide 
• Access 
to 
stream 
elements 
• DecomposiTon 
(for 
parallel 
operaTons) 
– Fork-­‐join 
framework 
• Stream 
characterisTcs 
– ORDERED 
– SORTED 
– DISTINCT 
– SIZED 
– NONNULL 
– IMMUTABLE 
– CONCURRENT
Stream 
Terminal 
OperaTons 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
• The 
pipeline 
is 
only 
evaluated 
when 
the 
terminal 
operaTon 
is 
called 
– All 
operaTons 
can 
execute 
sequenTally 
or 
in 
parallel 
– Intermediate 
operaTons 
can 
be 
merged 
• Avoiding 
mulTple 
redundant 
passes 
on 
data 
• Short-­‐circuit 
operaTons 
(e.g. 
findFirst) 
• Lazy 
evaluaTon 
– Stream 
characterisTcs 
help 
idenTfy 
opTmisaTons 
• DISTINT 
stream 
passed 
to 
distinct() 
is 
a 
no-­‐op
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
Maps 
and 
FlatMaps 
Map 
Values 
in 
a 
Stream 
Map 
FlatMap 
Input 
Stream 
Input 
Stream 
1-­‐to-­‐1 
mapping 
1-­‐to-­‐many 
mapping 
Output 
Stream 
Output 
Stream
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
Optional<T> 
Reducing 
NullPointerException 
Occurrences 
String 
direction 
= 
gpsData.getPosition().getLatitude().getDirection(); 
String 
direction 
= 
“UNKNOWN”; 
if 
(gpsData 
!= 
null) 
{ 
Position 
p 
= 
gpsData.getPosition(); 
if 
(p 
!= 
null) 
{ 
Latitude 
latitude 
= 
p.getLatitude(); 
if 
(latitude 
!= 
null) 
direction 
= 
latitude.getDirection(); 
} 
}
NullPointerException 
Occurrences 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
Optional<T> 
Reducing 
• Indicates 
that 
reference 
may, 
or 
may 
not 
have 
a 
value 
– Makes 
developer 
responsible 
for 
checking 
– A 
bit 
like 
a 
stream 
that 
can 
only 
have 
zero 
or 
one 
elements 
Optional<GPSData> 
maybeGPS 
= 
Optional.ofNullable(gpsData); 
maybeGPS.ifPresent(GPSData::printPosition); 
GPSData 
gps 
= 
maybeGPS.orElse(new 
GPSData()); 
maybeGPS.filter(g 
-­‐> 
g.lastRead() 
< 
2).ifPresent(GPSData.display());
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
Example 
1 
Convert 
words 
in 
list 
to 
upper 
case 
List<String> 
output 
= 
wordList 
.stream() 
.map(String::toUpperCase) 
.collect(Collectors.toList());
Example 
1 
Convert 
words 
in 
list 
to 
upper 
case 
(in 
parallel) 
List<String> 
output 
= 
wordList 
.parallelStream() 
.map(String::toUpperCase) 
.collect(Collectors.toList()); 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved.
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
Example 
2 
• BufferedReader 
has 
new 
method 
– Stream<String> 
lines() 
Count 
lines 
in 
a 
file 
long 
count 
= 
bufferedReader 
.lines() 
.count();
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
Example 
3 
Join 
lines 
3-­‐4 
into 
a 
single 
string 
String 
output 
= 
bufferedReader 
.lines() 
.skip(2) 
.limit(2) 
.collect(Collectors.joining());
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
Example 
4 
Collect 
all 
words 
in 
a 
file 
into 
a 
list 
List<String> 
output 
= 
reader 
.lines() 
.flatMap(line 
-­‐> 
Stream.of(line.split(REGEXP))) 
.filter(word 
-­‐> 
word.length() 
> 
0) 
.collect(Collectors.toList());
Example 
5 
List 
of 
unique 
words 
in 
lowercase, 
sorted 
by 
length 
List<String> 
output 
= 
reader 
.lines() 
.flatMap(line 
-­‐> 
Stream.of(line.split(REGEXP))) 
.filter(word 
-­‐> 
word.length() 
> 
0) 
.map(String::toLowerCase) 
.distinct() 
.sorted((x, 
y) 
-­‐> 
x.length() 
-­‐ 
y.length()) 
.collect(Collectors.toList()); 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved.
Example 
6: 
Real 
World 
Infinite 
stream 
from 
thermal 
sensor 
private 
int 
double 
currentTemperature; 
... 
thermalReader 
.lines() 
.mapToDouble(s 
-­‐> 
Double.parseDouble(s.substring(0, 
s.length() 
-­‐ 
1))) 
.map(t 
-­‐> 
((t 
– 
32) 
* 
5 
/ 
9) 
.filter(t 
-­‐> 
t 
!= 
currentTemperature) 
.peek(t 
-­‐> 
listener.ifPresent(l 
-­‐> 
l.temperatureChanged(t))) 
.forEach(t 
-­‐> 
currentTemperature 
= 
t); 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved.
Example 
6: 
Real 
World 
Infinite 
stream 
from 
thermal 
sensor 
private 
int 
double 
currentTemperature; 
... 
thermalReader 
.lines() 
.mapToDouble(s 
-­‐> 
Double.parseDouble(s.substring(0, 
s.length() 
-­‐ 
))) 
.map(t 
-­‐> 
((t 
– 
32) 
* 
5 
/ 
9) 
.filter(t 
-­‐> 
t 
!= 
this.currentTemperature) 
.peek(t 
-­‐> 
listener.ifPresent(l 
-­‐> 
l.temperatureChanged(t))) 
.forEach(t 
-­‐> 
this.currentTemperature 
= 
t); 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved.
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved. 
Conclusions 
• Java 
needs 
lambda 
statements 
– Significant 
improvements 
in 
exisTng 
libraries 
are 
required 
• Require 
a 
mechanism 
for 
interface 
evoluTon 
– SoluTon: 
virtual 
extension 
methods 
• Bulk 
operaTons 
on 
CollecTons 
– Much 
simpler 
with 
Lambdas 
• Java 
SE 
8 
evolves 
the 
language, 
libraries, 
and 
VM 
together
Simon 
Ri6er 
Oracle 
CorporarTon 
Twi6er: 
@speakjava 
Copyright 
© 
2014, 
Oracle 
and/or 
its 
affiliates. 
All 
rights 
reserved.

More Related Content

PPTX
Improved Developer Productivity In JDK8
PPTX
JDK8 Lambdas and Streams: Changing The Way You Think When Developing Java
PDF
Java SE 8
PPTX
Lambdas : Beyond The Basics
PPTX
Functional Programming With Lambdas and Streams in JDK8
PPTX
Functional programming with_jdk8-s_ritter
PPTX
55 New Features in Java SE 8
PPTX
Project Jigsaw in JDK9
Improved Developer Productivity In JDK8
JDK8 Lambdas and Streams: Changing The Way You Think When Developing Java
Java SE 8
Lambdas : Beyond The Basics
Functional Programming With Lambdas and Streams in JDK8
Functional programming with_jdk8-s_ritter
55 New Features in Java SE 8
Project Jigsaw in JDK9

What's hot (20)

PDF
Java SE 8 library design
PDF
Apouc 2014-java-8-create-the-future
PPTX
Introduction of Java 8 with emphasis on Lambda Expressions and Streams
PPTX
Java 8 Features
PPTX
Project Lambda: Functional Programming Constructs in Java - Simon Ritter (Ora...
PDF
Java SE 8 best practices
PPT
java programming - applets
PDF
The Java Carputer
PPTX
java 8 new features
PPTX
Java 8 Features
PDF
Java 8 Lambda Expressions & Streams
PDF
Functional Java 8 - Introduction
PDF
Automatic Migration of Legacy Java Method Implementations to Interfaces
PPTX
Whats New in Java 5, 6, & 7 (Webinar Presentation - June 2013)
PDF
Lambdas & Streams
PPTX
Java 8 - Features Overview
PDF
Exception handling
PPTX
Lambda Expressions in Java 8
PPTX
Functional programming with Java 8
PPTX
Java 8 new features
Java SE 8 library design
Apouc 2014-java-8-create-the-future
Introduction of Java 8 with emphasis on Lambda Expressions and Streams
Java 8 Features
Project Lambda: Functional Programming Constructs in Java - Simon Ritter (Ora...
Java SE 8 best practices
java programming - applets
The Java Carputer
java 8 new features
Java 8 Features
Java 8 Lambda Expressions & Streams
Functional Java 8 - Introduction
Automatic Migration of Legacy Java Method Implementations to Interfaces
Whats New in Java 5, 6, & 7 (Webinar Presentation - June 2013)
Lambdas & Streams
Java 8 - Features Overview
Exception handling
Lambda Expressions in Java 8
Functional programming with Java 8
Java 8 new features
Ad

Similar to Lambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon Ritter (20)

PPTX
Lambdas and-streams-s ritter-v3
PPTX
What's New in Java 8
PDF
Java 8
PDF
Project Lambda: To Multicore and Beyond
PPTX
PDF
Java 8 by example!
PDF
PPTX
The Road to Lambda - Mike Duigou
PPTX
Java gets a closure
PPTX
PPTX
java150929145120-lva1-app6892 (2).pptx
PDF
Java 8 Workshop
PPTX
Java 8 presentation
PPTX
Java 8 lambda
PDF
Productive Programming in Java 8 - with Lambdas and Streams
PPTX
Java 8 Feature Preview
PPTX
Java 8 - An Overview
PDF
PPTX
A brief tour of modern Java
PDF
JSR 335 / java 8 - update reference
Lambdas and-streams-s ritter-v3
What's New in Java 8
Java 8
Project Lambda: To Multicore and Beyond
Java 8 by example!
The Road to Lambda - Mike Duigou
Java gets a closure
java150929145120-lva1-app6892 (2).pptx
Java 8 Workshop
Java 8 presentation
Java 8 lambda
Productive Programming in Java 8 - with Lambdas and Streams
Java 8 Feature Preview
Java 8 - An Overview
A brief tour of modern Java
JSR 335 / java 8 - update reference
Ad

More from JAXLondon2014 (20)

PDF
GridGain 6.0: Open Source In-Memory Computing Platform - Nikita Ivanov
PDF
Performance Metrics for your Delivery Pipeline - Wolfgang Gottesheim
PPTX
How to randomly access data in close-to-RAM speeds but a lower cost with SSD’...
PDF
Conditional Logging Considered Harmful - Sean Reilly
PDF
Finding your Way in the Midst of the NoSQL Haze - Abdelmonaim Remani
PPT
API Management - a hands on workshop - Paul Fremantle
PDF
'Bootiful' Code with Spring Boot - Josh Long
PDF
The Full Stack Java Developer - Josh Long
PDF
The Economies of Scaling Software - Josh Long and Abdelmonaim Remani
PDF
Dataflow, the Forgotten Way - Russel Winder
PDF
Habits of Highly Effective Technical Teams - Martijn Verburg
PDF
The Lazy Developer's Guide to Cloud Foundry - Holly Cummins
PPTX
Testing within an Agile Environment - Beyza Sakir and Chris Gollop
PDF
Testing the Enterprise Layers - the A, B, C's of Integration Testing - Aslak ...
PDF
Squeezing Performance of out of In-Memory Data Grids - Fuad Malikov
PDF
Spocktacular Testing - Russel Winder
PDF
Server Side JavaScript on the Java Platform - David Delabassee
PDF
Reflection Madness - Dr. Heinz Kabutz
PDF
Rapid Web Application Development with MongoDB and the JVM - Trisha Gee
PDF
Pushing Java EE outside of the Enterprise: Home Automation and IoT - David De...
GridGain 6.0: Open Source In-Memory Computing Platform - Nikita Ivanov
Performance Metrics for your Delivery Pipeline - Wolfgang Gottesheim
How to randomly access data in close-to-RAM speeds but a lower cost with SSD’...
Conditional Logging Considered Harmful - Sean Reilly
Finding your Way in the Midst of the NoSQL Haze - Abdelmonaim Remani
API Management - a hands on workshop - Paul Fremantle
'Bootiful' Code with Spring Boot - Josh Long
The Full Stack Java Developer - Josh Long
The Economies of Scaling Software - Josh Long and Abdelmonaim Remani
Dataflow, the Forgotten Way - Russel Winder
Habits of Highly Effective Technical Teams - Martijn Verburg
The Lazy Developer's Guide to Cloud Foundry - Holly Cummins
Testing within an Agile Environment - Beyza Sakir and Chris Gollop
Testing the Enterprise Layers - the A, B, C's of Integration Testing - Aslak ...
Squeezing Performance of out of In-Memory Data Grids - Fuad Malikov
Spocktacular Testing - Russel Winder
Server Side JavaScript on the Java Platform - David Delabassee
Reflection Madness - Dr. Heinz Kabutz
Rapid Web Application Development with MongoDB and the JVM - Trisha Gee
Pushing Java EE outside of the Enterprise: Home Automation and IoT - David De...

Recently uploaded (20)

PPTX
ART-APP-REPORT-FINctrwxsg f fuy L-na.pptx
PPTX
Tablets And Capsule Preformulation Of Paracetamol
PPTX
The Effect of Human Resource Management Practice on Organizational Performanc...
DOCX
ENGLISH PROJECT FOR BINOD BIHARI MAHTO KOYLANCHAL UNIVERSITY
PPTX
PHIL.-ASTRONOMY-AND-NAVIGATION of ..pptx
PPTX
fundraisepro pitch deck elegant and modern
DOCX
"Project Management: Ultimate Guide to Tools, Techniques, and Strategies (2025)"
PDF
6.-propertise of noble gases, uses and isolation in noble gases
PPTX
PurpoaiveCommunication for students 02.pptx
PPTX
Self management and self evaluation presentation
PPTX
Human Mind & its character Characteristics
PPTX
_ISO_Presentation_ISO 9001 and 45001.pptx
PPTX
3RD-Q 2022_EMPLOYEE RELATION - Copy.pptx
PPTX
NORMAN_RESEARCH_PRESENTATION.in education
PPTX
Impressionism_PostImpressionism_Presentation.pptx
PPTX
MERISTEMATIC TISSUES (MERISTEMS) PPT PUBLIC
PPTX
Intro to ISO 9001 2015.pptx wareness raising
PDF
Presentation1 [Autosaved].pdf diagnosiss
PPTX
2025-08-10 Joseph 02 (shared slides).pptx
PPTX
Introduction-to-Food-Packaging-and-packaging -materials.pptx
ART-APP-REPORT-FINctrwxsg f fuy L-na.pptx
Tablets And Capsule Preformulation Of Paracetamol
The Effect of Human Resource Management Practice on Organizational Performanc...
ENGLISH PROJECT FOR BINOD BIHARI MAHTO KOYLANCHAL UNIVERSITY
PHIL.-ASTRONOMY-AND-NAVIGATION of ..pptx
fundraisepro pitch deck elegant and modern
"Project Management: Ultimate Guide to Tools, Techniques, and Strategies (2025)"
6.-propertise of noble gases, uses and isolation in noble gases
PurpoaiveCommunication for students 02.pptx
Self management and self evaluation presentation
Human Mind & its character Characteristics
_ISO_Presentation_ISO 9001 and 45001.pptx
3RD-Q 2022_EMPLOYEE RELATION - Copy.pptx
NORMAN_RESEARCH_PRESENTATION.in education
Impressionism_PostImpressionism_Presentation.pptx
MERISTEMATIC TISSUES (MERISTEMS) PPT PUBLIC
Intro to ISO 9001 2015.pptx wareness raising
Presentation1 [Autosaved].pdf diagnosiss
2025-08-10 Joseph 02 (shared slides).pptx
Introduction-to-Food-Packaging-and-packaging -materials.pptx

Lambdas and Streams in Java SE 8: Making Bulk Operations simple - Simon Ritter

  • 2. Lambdas & Streams In JDK8 Making Bulk Opera/ons Simple Simon Ri6er Head of Java Technology Evangelism Oracle Corp. Twi6er: @speakjava Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
  • 3. Safe Harbor Statement The following is intended to outline our general product direcTon. It is intended for informaTon purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or funcTonality, and should not be relied upon in making purchasing decisions. The development, release, and Tming of any features or funcTonality described for Oracle’s products remains at the sole discreTon of Oracle. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 3
  • 4. java.util.concurrent (jsr166) 1.0 5.0 6 7 8 1996 … 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. java.lang.Thread Fork/Join Framework (jsr166y) Concurrency in Java Project Lambda Phasers, etc (jsr166)
  • 5. Lambdas In Java Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
  • 6. The Problem: External IteraTon List<Student> students = ... double highestScore = 0.0; for (Student s : students) { if (s.getGradYear() == 2011) { if (s.getScore() > highestScore) highestScore = s.score; } } • Our code controls iteraTon • Inherently Copyright © 2014, Oracle and/or its affiliates. All rights reserved. serial: iterate from beginning to end • Not thread-­‐safe • Business logic is stateful • Mutable accumulator variable
  • 7. Internal IteraTon With Inner Classes • IteraTon handled by the library • Not inherently serial – traversal Copyright © 2014, Oracle and/or its affiliates. All rights reserved. may be done in parallel • Traversal may be done lazily – so one pass, rather than three • Thread safe – client logic is stateless • High barrier to use – SyntacTcally ugly More FuncTonal double highestScore = students .filter(new Predicate<Student>() { public boolean op(Student s) { return s.getGradYear() == 2011; } }) .map(new Mapper<Student,Double>() { public Double extract(Student s) { return s.getScore(); } }) .max();
  • 8. Internal IteraTon With Lambdas Copyright © 2014, Oracle and/or its affiliates. All rights reserved. List<Student> students = ... double highestScore = students .filter(Student s -­‐> s.getGradYear() == 2011) .map(Student s -­‐> s.getScore()) .max(); • More readable • More abstract • Less error-­‐prone NOTE: This is not JDK8 code
  • 9. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. Lambda Expressions Some Details • Lambda expressions represent anonymous funcTons – Same structure as a method • typed argument list, return type, set of thrown excepTons, and a body – Not associated with a class • We now have parameterised behaviour, not just values double highestScore = students. filter(Student s -­‐> s.getGradYear() == 2011). map(Student s -­‐> s.getScore()) max(); What How
  • 10. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. Lambda Expression Types • Single-­‐method interfaces are used extensively in Java – DefiniTon: a func2onal interface is an interface with one abstract method – Func2onal interfaces are idenTfied structurally – The type of a lambda expression will be a func2onal interface • Lambda expressions provide implementaTons of the abstract method interface Comparator<T> { boolean compare(T x, T y); } interface FileFilter { boolean accept(File x); } interface Runnable { void run(); } interface ActionListener { void actionPerformed(…); } interface Callable<T> { T call(); }
  • 11. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. Local Variable Capture • Lambda expressions can refer to effec2vely final local variables from the enclosing scope • EffecTvely final: A variable that meets the requirements for final variables (i.e., assigned once), even if not explicitly declared final • Closures on values, not variables void expire(File root, long before) { root.listFiles(File p -­‐> p.lastModified() <= before); }
  • 12. What Does ‘this’ Mean For Lambdas? • ‘this’ refers to the enclosing object, not the lambda itself Copyright © 2014, Oracle and/or its affiliates. All rights reserved. • Think of ‘this’ as a final predefined local • Remember the Lambda is an anonymous func2on – It is not associated with a class – Therefore there can be no ‘this’ for the Lambda
  • 13. Referencing Instance Variables Which are not final, or effecTvely final Copyright © 2014, Oracle and/or its affiliates. All rights reserved. class DataProcessor { private int currentValue; public void process() { DataSet myData = myFactory.getDataSet(); dataSet.forEach(d -­‐> d.use(currentValue++)); } }
  • 14. Referencing Instance Variables The compiler helps us out Copyright © 2014, Oracle and/or its affiliates. All rights reserved. class DataProcessor { private int currentValue; public void process() { DataSet myData = myFactory.getDataSet(); dataSet.forEach(d -­‐> d.use(this.currentValue++); } } ‘this’ (which is effecTvely final) inserted by the compiler
  • 15. static T void sort(List<T> l, Comparator<? super T> c); List<String> list = getList(); Collections.sort(list, (String x, String y) -­‐> x.length() -­‐ y.length()); Collections.sort(list, (x, y) -­‐> x.length() -­‐ y.length()); Copyright © 2014, Oracle and/or its affiliates. All rights reserved. Type Inference • The compiler can oien infer parameter types in a lambda expression § Inferrence based on the target funcTonal interface’s method signature • Fully staTcally typed (no dynamic typing sneaking in) – More typing with less typing
  • 16. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. Method References • Method references let us reuse a method as a lambda expression FileFilter x = File f -­‐> f.canRead(); FileFilter x = File::canRead;
  • 17. Factory<List<String>> f = () -­‐> return new ArrayList<String>(); Replace with Copyright © 2014, Oracle and/or its affiliates. All rights reserved. Constructor References • Same concept as a method reference – For the constructor Factory<List<String>> f = ArrayList<String>::new;
  • 18. Library EvoluTon Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
  • 19. int heaviestBlueBlock = blocks .filter(b -­‐> b.getColor() == BLUE) .map(Block::getWeight) .reduce(0, Integer::max); Copyright © 2014, Oracle and/or its affiliates. All rights reserved. Library EvoluTon Goal • Requirement: aggregate operaTons on collecTons – New methods required on CollecTons to facilitate this • This is problemaTc – Can’t add new methods to interfaces without modifying all implementaTons – Can’t necessarily find or control all implementaTons
  • 20. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. SoluTon: Default Methods • Specified in the interface • From the caller’s perspecTve, just an ordinary interface method • Provides a default implementaTon • Default only used when implementaTon classes do not provide a body for the extension method • ImplementaTon classes can provide a be6er version, or not interface Collection<E> { default Stream<E> stream() { return StreamSupport.stream(spliterator()); } }
  • 21. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. Virtual Extension Methods Stop right there! • Err, isn’t this implemenTng mulTple inheritance for Java? • Yes, but Java already has mulTple inheritance of types • This adds mulTple inheritance of behavior too • But not state, which is where most of the trouble is • Can sTll be a source of complexity • Class implements two interfaces, both of which have default methods • Same signature • How does the compiler differenTate? • StaTc methods also allowed in interfaces in Java SE 8
  • 22. FuncTonal Interface DefiniTon Copyright © 2014, Oracle and/or its affiliates. All rights reserved. • Single Abstract Method (SAM) type • A funcTonal interface is an interface that has one abstract method – Represents a single funcTon contract – Doesn’t mean it only has one method • @FunctionalInterface annotaTon – Helps ensure the funcTonal interface contract is honoured – Compiler error if not a SAM
  • 23. Lambdas In Full Flow: Streams Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
  • 24. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. Aggregate OperaTons • Most business logic is about aggregate operaTons – “Most profitable product by region” – “Group transacTons by currency” • As we have seen, up to now, Java uses external iteraTon – Inherently serial – FrustraTngly imperaTve • Java SE 8’s answer: The Stream API – With help from Lambdas
  • 25. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. Stream Overview At The High Level • AbstracTon for specifying aggregate computaTons – Not a data structure – Can be infinite • Simplifies the descripTon of aggregate computaTons – Exposes opportuniTes for opTmisaTon – Fusing, laziness and parallelism
  • 26. Source Copyright © 2014, Oracle and/or its affiliates. All rights reserved. Stream Overview • A stream pipeline consists of three types of things – A source – Zero or more intermediate operaTons – A terminal operaTon • Producing a result or a side-­‐effect Pipeline int total = transactions.stream() .filter(t -­‐> t.getBuyer().getCity().equals(“London”)) .mapToInt(Transaction::getPrice) .sum(); Intermediate operaTon Terminal operaTon
  • 27. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. Stream Sources Many Ways To Create • From collecTons and arrays – Collection.stream() – Collection.parallelStream() – Arrays.stream(T array) or Stream.of() • StaTc factories – IntStream.range() – Files.walk() • Roll your own – java.util.Spliterator
  • 28. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. Stream Sources Provide • Access to stream elements • DecomposiTon (for parallel operaTons) – Fork-­‐join framework • Stream characterisTcs – ORDERED – SORTED – DISTINCT – SIZED – NONNULL – IMMUTABLE – CONCURRENT
  • 29. Stream Terminal OperaTons Copyright © 2014, Oracle and/or its affiliates. All rights reserved. • The pipeline is only evaluated when the terminal operaTon is called – All operaTons can execute sequenTally or in parallel – Intermediate operaTons can be merged • Avoiding mulTple redundant passes on data • Short-­‐circuit operaTons (e.g. findFirst) • Lazy evaluaTon – Stream characterisTcs help idenTfy opTmisaTons • DISTINT stream passed to distinct() is a no-­‐op
  • 30. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. Maps and FlatMaps Map Values in a Stream Map FlatMap Input Stream Input Stream 1-­‐to-­‐1 mapping 1-­‐to-­‐many mapping Output Stream Output Stream
  • 31. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. Optional<T> Reducing NullPointerException Occurrences String direction = gpsData.getPosition().getLatitude().getDirection(); String direction = “UNKNOWN”; if (gpsData != null) { Position p = gpsData.getPosition(); if (p != null) { Latitude latitude = p.getLatitude(); if (latitude != null) direction = latitude.getDirection(); } }
  • 32. NullPointerException Occurrences Copyright © 2014, Oracle and/or its affiliates. All rights reserved. Optional<T> Reducing • Indicates that reference may, or may not have a value – Makes developer responsible for checking – A bit like a stream that can only have zero or one elements Optional<GPSData> maybeGPS = Optional.ofNullable(gpsData); maybeGPS.ifPresent(GPSData::printPosition); GPSData gps = maybeGPS.orElse(new GPSData()); maybeGPS.filter(g -­‐> g.lastRead() < 2).ifPresent(GPSData.display());
  • 33. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. Example 1 Convert words in list to upper case List<String> output = wordList .stream() .map(String::toUpperCase) .collect(Collectors.toList());
  • 34. Example 1 Convert words in list to upper case (in parallel) List<String> output = wordList .parallelStream() .map(String::toUpperCase) .collect(Collectors.toList()); Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
  • 35. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. Example 2 • BufferedReader has new method – Stream<String> lines() Count lines in a file long count = bufferedReader .lines() .count();
  • 36. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. Example 3 Join lines 3-­‐4 into a single string String output = bufferedReader .lines() .skip(2) .limit(2) .collect(Collectors.joining());
  • 37. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. Example 4 Collect all words in a file into a list List<String> output = reader .lines() .flatMap(line -­‐> Stream.of(line.split(REGEXP))) .filter(word -­‐> word.length() > 0) .collect(Collectors.toList());
  • 38. Example 5 List of unique words in lowercase, sorted by length List<String> output = reader .lines() .flatMap(line -­‐> Stream.of(line.split(REGEXP))) .filter(word -­‐> word.length() > 0) .map(String::toLowerCase) .distinct() .sorted((x, y) -­‐> x.length() -­‐ y.length()) .collect(Collectors.toList()); Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
  • 39. Example 6: Real World Infinite stream from thermal sensor private int double currentTemperature; ... thermalReader .lines() .mapToDouble(s -­‐> Double.parseDouble(s.substring(0, s.length() -­‐ 1))) .map(t -­‐> ((t – 32) * 5 / 9) .filter(t -­‐> t != currentTemperature) .peek(t -­‐> listener.ifPresent(l -­‐> l.temperatureChanged(t))) .forEach(t -­‐> currentTemperature = t); Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
  • 40. Example 6: Real World Infinite stream from thermal sensor private int double currentTemperature; ... thermalReader .lines() .mapToDouble(s -­‐> Double.parseDouble(s.substring(0, s.length() -­‐ ))) .map(t -­‐> ((t – 32) * 5 / 9) .filter(t -­‐> t != this.currentTemperature) .peek(t -­‐> listener.ifPresent(l -­‐> l.temperatureChanged(t))) .forEach(t -­‐> this.currentTemperature = t); Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
  • 41. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. Conclusions • Java needs lambda statements – Significant improvements in exisTng libraries are required • Require a mechanism for interface evoluTon – SoluTon: virtual extension methods • Bulk operaTons on CollecTons – Much simpler with Lambdas • Java SE 8 evolves the language, libraries, and VM together
  • 42. Simon Ri6er Oracle CorporarTon Twi6er: @speakjava Copyright © 2014, Oracle and/or its affiliates. All rights reserved.