SlideShare a Scribd company logo
Harnessing the power of
Java 8 Streams
Praveer Gupta
Default Methods
Lambda Expressions
Streams
Date-Time API
CompletableFuture
Optional
helps to make a strategic decision about what
programming language should be adopted
when starting to build a new software system
Java 8 released on
Mar 18, 2014
–Robert C. Martin
“There are two parts to learning
craftsmanship: knowledge and work.
You must gain the knowledge of
principles, patterns, practices, and
heuristics that a craftsman knows,
and
you must also grind that knowledge
into your fingers, eyes, and gut by
working hard and
practicing..”
Stream
Intermediate Operators
Terminal Operators
Harnessing the power Java 8 Streams
Programming Paradigm Concepts
Stream
Collectorscollectreduce
Intermediate Operators
Terminal Operators
computation creation Primitive Streams
stateless/stateful
Lazy &
Short-Circuited
Harnessing the power Java 8 Streams
Declarative
Programming
Internal
Iteration
chained categories
Programming Paradigm Concepts
Harnessing the power Java 8 Streams
Declarative
Programming
Internal
Iteration
Programming Paradigm Concepts
Declarative
SELECT NAME FROM PERSON WHERE AGE > 18;
List<String> adults = group.stream()

.filter(p -> p.age() > 18)
.map(Person::name)

.collect(toList());
You declare what the program has to do
and the library takes care of how to do it
Declarative
Focuses on
What
List<String> adults = new ArrayList<>();

for (Person person: group) 

if (person.age() > 18)

adults.add(person.name());
Focuses on
How and
What
vs Imperative
List<String> adults = group.stream()

.filter(p -> p.age() > 18)
.map(Person::name)

.collect(toList());
Old way vs New way
final List<String> names = new ArrayList<>();

for (Person p : group)

if (p.age() > 18)
names.add(p.name());

return names;
return group.stream()

.filter(p -> p.age() > 18)

.map(Person::name)

.collect(toList());
List<String> namesOfAdultsInTheGroup(List<Person> group) {
}
External Iteration
Internal Iteration
new declarative way
old imperative way
List<String> namesOfAdultsInTheGroup(List<Person> group) {
}
Application of Streams
interface CustomerRepository {

List<Customer> findByCity(String cityName);

}
API Definition
Application of Streams
interface CustomerRepository {

Stream<Customer> findByCity(String cityName);

}
try (Stream<String> stream =
repository.findByCity(“Pune")) {

return stream.filter(…).count();

}
API Definition
Usage of the API
Consume items as they arrive
Efficient memory usage
Stream
computation creation
Harnessing the power Java 8 Streams
Declarative
Programming
Internal
Iteration
Programming Paradigm Concepts
Stream
a read-only sequence of elements
computational operations that will be performed
in aggregate
Collection
efficient management of elements
efficient access to elements
Stream Pipeline
Stream
Terminal
Operator
Operator1
Operator2
Operator3
Intermediate
Operators
(Zero or more)
Stream
Terminal
Operator
Operator1
Operator2
Operator3
Stream Pipeline
List<String> namesOfAdultsInTheGroup(List<Person> group) {

return







}
group.stream()
.filter(p -> p.age() > 18)
.map(Person::name)
.collect(Collectors.toList());
names
group
Stream<Person>
Archer
(22 years)
Barbara
(17 years)
Daisy
(25 years)
is person’s age > 18 ?
Stream<Person>
Stream<String>
map to name of person
collect into a list
group.stream()
.filter(p ->
p.age() > 18)
.map(Person::name)
.collect(
Collectors.toList());
Archer
(22 years)
Barbara
(17 years)
Daisy
(25 years)
Archer
(22 years)
Daisy
(25 years)
Archer Daisy
Archer Daisy
Creating Stream
From Collection
List<String> list = Arrays.asList("a", "b", "c");

Stream<String> stream = list.stream();
String[] array = {"a", "b", "c"};

Stream<String> stream = Arrays.stream(array);
Creating Stream
From an I/O Channel
try (Stream<Path> stream =
Files.list(Paths.get(“.”));) {
…
}
Stream interface extends AutoCloseable
Creating Stream
Using Generator Functions
Stream<Double> stream = Stream.generate(Math::random);
Stream<Integer> stream = Stream.iterate(0, n -> n + 3);
Both are unbounded
Parallel Stream
From Collection
List<String> list = Arrays.asList("a", "b", "c");

Stream<String> stream = list.parallelStream();
From another Stream
Stream<String> parallelStream = stream.parallel();
List<String> list = Arrays.asList("a", "b", "c");

Stream<String> stream = list.parallelStream();
Stream<String> parallelStream = stream.parallel();
Parallel Stream
How does it work?
Splitting Combining
Parallel
Processing
Parallel Stream
Performance Impact
Always measure performance before using parallel
Stream size predictability & Amount of data
Decomposability of source data structure
Computational Cost
Stream
Intermediate Operators
computation creation
stateless/stateful
Harnessing the power Java 8 Streams
Declarative
Programming
Internal
Iteration
chained categories
Programming Paradigm Concepts
Intermediate Operators
Stream
Terminal
Operator
Operator1
Operator2
Operator3
Intermediate
Operators
(Zero or more)
Intermediate Operators
Categories
Stream<Integer> stream = Stream.of(3, 2, 1);
Stream<Integer> filtered =
stream.filter(n -> n % 2 == 0);
Filtering
Type of stream remains the same
Stream<Integer> filtered =
stream.filter(n -> n % 2 == 0);
Intermediate Operators
Categories
Stream<Integer> stream = Stream.of(3, 2, 1);
Stream<String> mapped = stream.map(Object::toString);
Mapping
Type of stream gets altered (here Integer to String)
Stream<String> mapped = stream.map(Object::toString);
Intermediate Operators
Categories
Stream<Integer> stream = Stream.of(3, 2, 1);
Stream<Integer> sliced = stream.limit(1);
Slicing
Type of stream remains the same
Stream<Integer> sliced = stream.limit(1);
Stream.of(1, 2, 3, 4)

.peek(System.out::println)

.filter(n -> n % 2 == 0);
Intermediate Operators
Laziness
Stream.of(1, 2, 3, 4)

.peek(System.out::println)

.filter(n -> n % 2 == 0)

.collect(toList());
Stream.of(1, 2, 3, 4)

.peek(System.out::println)

.filter(n -> n % 2 == 0);
Terminal operator is required to start stream processing
Stream.of(1, 2, 3, 4)

.peek(System.out::println)

.filter(n -> n % 2 == 0)

.collect(toList());
Peek will not print
anything
Intermediate Operators
Short-Circuiting
Stream.of(1, 2, 3, 4)

.peek(System.out::println)

.filter(n -> n % 2 == 0)

.findFirst();
Stream will get short-circuited
after the first element is found
Peek will print
only 1 & 2
Stream.of(1, 2, 3, 4)

.peek(System.out::println)

.filter(n -> n % 2 == 0)

.findFirst();
Intermediate Operators
Stateless
vs Stateful
Stream.of(1, 2, 3, 4)

.peek(System.out::println)

.filter(n -> n % 2 == 0)

.findFirst();
Stream.of(1, 2, 3, 4)

.peek(System.out::println)

.sorted(Comparator.reverseOrder())

.filter(n -> n % 2 == 0)

.findFirst();
Will cause the
whole stream
to be
traversed
All operations
are done on
current value
in stream
Stream.of(1, 2, 3, 4)

.peek(System.out::println)

.sorted(Comparator.reverseOrder())

.filter(n -> n % 2 == 0)

.findFirst();
Stream
Collectorscollectreduce
Intermediate Operators
Terminal Operators
computation creation
stateless/stateful
Lazy &
Short-Circuited
Harnessing the power Java 8 Streams
Declarative
Programming
Internal
Iteration
chained categories
Programming Paradigm Concepts
Terminal Operators
Single Value Collection
Reduce Operation Collect Operation
Terminal Operators
reduce
<U> U reduce(U identity,

BiFunction<U, ? super T, U> accumulator,

BinaryOperator<U> combiner);
Stream.of(3, 2, 1).reduce(0, Integer::sum, Integer::sum);
Stream.of(3, 2, 1).reduce(0, Integer::sum);
Immutable Reduction Process
<U> U reduce(U identity,

BiFunction<U, ? super T, U> accumulator,

BinaryOperator<U> combiner);
<U> U reduce(U identity,

BiFunction<U, ? super T, U> accumulator,

BinaryOperator<U> combiner);
<U> U reduce(U identity,

BiFunction<U, ? super T, U> accumulator,

BinaryOperator<U> combiner);
Terminal Operators
reduce utility methods
Optional<Integer> max =
Stream.of(1, 2, 3)
.max(Comparator.naturalOrder());
boolean result = Stream.of(1, 2, 3)
.anyMatch(n -> n > 2);
Optional<Integer> max =
Stream.of(1, 2, 3)
.max(Comparator.naturalOrder());
boolean result = Stream.of(1, 2, 3)
.anyMatch(n -> n > 2);
Terminal Operators
collect
Mutable Reduction Process
Accumulates elements into a mutable result container
Stream.of("a", "b", "c").reduce("", String::concat);
String copying = Low Performance !!
Terminal Operators
collect
<R> R collect(Supplier<R> supplier,

BiConsumer<R, ? super T> accumulator,

BiConsumer<R, R> combiner);
StringBuilder builder = Stream.of("a", "b", "c").collect(

StringBuilder::new, 

StringBuilder::append, 

StringBuilder::append

);
StringBuilder is the mutable container here
Terminal Operators
Collectors class
String joinedString = Stream.of(“a", "b", “c")
.collect(Collectors.joining(", "));
IntSummaryStatistics statistics = group.stream()
.collect(Collectors.summarizingInt(Person::age));
IntSummaryStatistics{count=10, sum=280, min=26, average=28.000000, max=30}
Output: a, b, c
String joinedString = Stream.of(“a", "b", “c")
.collect(Collectors.joining(", "));
IntSummaryStatistics statistics = group.stream()
.collect(Collectors.summarizingInt(Person::age));
Terminal Operators
Downstream Collectors
Map<Integer, List<Person>> result = group.stream()
.collect(Collectors.groupingBy(Person::age,

Collectors.toList()));
Map<Integer, List<Person>> result = group.stream()
.collect(groupingBy(Person::age));
Divide into different age groups
Terminal Operators
Downstream Collectors
Map<Integer, Long> result = group.stream()
.collect(groupingBy(Person::age, counting()));
Map<Integer, List<String>> result = group.stream()
.collect(groupingBy(Person::age,

mapping(Person::name, toList())));
Count of people in each age group
Names on people in each age group
Stream
Collectorscollectreduce
Intermediate Operators
Terminal Operators
computation creation Primitive Streams
stateless/stateful
Lazy &
Short-Circuited
Harnessing the power Java 8 Streams
Declarative
Programming
Internal
Iteration
chained categories
Programming Paradigm Concepts
Primitive Streams
IntStream DoubleStreamLongStream
Avoid boxing and
unboxing costs
Numeric operations
are available
XXXFunction
XXXPredicateXXXSupplierXXXConsumer
XXXToXXXFunction
Primitive Functional Interfaces
Primitive Streams
Creating from factory methods
IntStream intStream = IntStream.range(1, 10);
DoubleStream doubleStream = DoubleStream.of(1.0, 2.0);
LongStream longStream =
LongStream.iterate(0L, n -> n + 4);
Generating a range of numbers
Stream of known set of numbers
Stream using iterative application of a function
Stream<Person> stream = group.stream();
Primitive Streams
Obtaining from Stream<T>
mapToXXX flatMapToXXX
IntStream intStream = stream.mapToInt(Person::age);
OptionalDouble averageAge = intStream.average();
Specialized methods on Primitive Streams
IntStream intStream = stream.mapToInt(Person::age);
Primitive Streams
Converting back to Stream<T>
Stream<Integer> boxed = IntStream.of(1, 2, 3).boxed();Stream<Integer> boxed = IntStream.of(1, 2, 3).boxed();
Stream
Collectorscollectreduce
Intermediate Operators
Terminal Operators
computation creation Primitive Streams
stateless/stateful
Lazy &
Short-Circuited
Harnessing the power Java 8 Streams
Declarative
Programming
Internal
Iteration
chained categories
Programming Paradigm Concepts
Questions?
http://praveer09.github.io
@praveerguptapraveer

More Related Content

PPT
Functional Programming Past Present Future
PDF
How to Think in RxJava Before Reacting
PDF
Parallel streams in java 8
PDF
Java 8 Stream API. A different way to process collections.
PPT
Java 8 Streams
PDF
Reactive Programming for a demanding world: building event-driven and respons...
PPTX
Столпы функционального программирования для адептов ООП, Николай Мозговой
PPTX
Introduction to rx java for android
Functional Programming Past Present Future
How to Think in RxJava Before Reacting
Parallel streams in java 8
Java 8 Stream API. A different way to process collections.
Java 8 Streams
Reactive Programming for a demanding world: building event-driven and respons...
Столпы функционального программирования для адептов ООП, Николай Мозговой
Introduction to rx java for android

What's hot (20)

PDF
If You Think You Can Stay Away from Functional Programming, You Are Wrong
PDF
Rxjava meetup presentation
PDF
Java 8 Lambda Expressions
PDF
The... Wonderful? World of Lambdas
PDF
Spark workshop
PPTX
Hot Streaming Java
PDF
Reactive programming with RxJava
PPTX
Flink Batch Processing and Iterations
PDF
How and why I turned my old Java projects into a first-class serverless compo...
PPTX
An Introduction to RxJava
PPTX
Apache Flink Training: DataSet API Basics
PDF
Java programming lab manual
PDF
Spark schema for free with David Szakallas
PDF
Java 8 Workshop
PDF
Map(), flatmap() and reduce() are your new best friends: simpler collections,...
PDF
Java Lab Manual
DOC
CS2309 JAVA LAB MANUAL
PPTX
Functional Reactive Programming (FRP): Working with RxJS
PPTX
Java Language fundamental
PDF
Laziness, trampolines, monoids and other functional amenities: this is not yo...
If You Think You Can Stay Away from Functional Programming, You Are Wrong
Rxjava meetup presentation
Java 8 Lambda Expressions
The... Wonderful? World of Lambdas
Spark workshop
Hot Streaming Java
Reactive programming with RxJava
Flink Batch Processing and Iterations
How and why I turned my old Java projects into a first-class serverless compo...
An Introduction to RxJava
Apache Flink Training: DataSet API Basics
Java programming lab manual
Spark schema for free with David Szakallas
Java 8 Workshop
Map(), flatmap() and reduce() are your new best friends: simpler collections,...
Java Lab Manual
CS2309 JAVA LAB MANUAL
Functional Reactive Programming (FRP): Working with RxJS
Java Language fundamental
Laziness, trampolines, monoids and other functional amenities: this is not yo...
Ad

Similar to Harnessing the Power of Java 8 Streams (20)

PPTX
ADT02 - Java 8 Lambdas and the Streaming API
PDF
Lambda.pdf
PDF
Charles Sharp: Java 8 Streams
PDF
Java Lambda internals with invoke dynamic
PDF
Streams in Java 8
PPTX
Java 8 streams
PPTX
Java 8 Streams And Common Operations By Harmeet Singh(Taara)
PPTX
Java 8 Lambda and Streams
PPTX
Java 8
PDF
JDK8 Functional API
PPTX
Java8 training - Class 1
PPTX
PPTX
Exploring Streams and Lambdas in Java8
PDF
Shooting the Rapids: Getting the Best from Java 8 Streams
PPTX
Java8lambda
PDF
cb streams - gavin pickin
PDF
Java 8 - functional features
PPTX
A Brief Conceptual Introduction to Functional Java 8 and its API
PDF
Functional programming with streams
PDF
Going reactive in java
ADT02 - Java 8 Lambdas and the Streaming API
Lambda.pdf
Charles Sharp: Java 8 Streams
Java Lambda internals with invoke dynamic
Streams in Java 8
Java 8 streams
Java 8 Streams And Common Operations By Harmeet Singh(Taara)
Java 8 Lambda and Streams
Java 8
JDK8 Functional API
Java8 training - Class 1
Exploring Streams and Lambdas in Java8
Shooting the Rapids: Getting the Best from Java 8 Streams
Java8lambda
cb streams - gavin pickin
Java 8 - functional features
A Brief Conceptual Introduction to Functional Java 8 and its API
Functional programming with streams
Going reactive in java
Ad

More from IndicThreads (20)

PPTX
Http2 is here! And why the web needs it
ODP
Understanding Bitcoin (Blockchain) and its Potential for Disruptive Applications
PPT
Go Programming Language - Learning The Go Lang way
PPT
Building Resilient Microservices
PPT
App using golang indicthreads
PDF
Building on quicksand microservices indicthreads
PPT
Iot secure connected devices indicthreads
PDF
Real world IoT for enterprises
PPT
IoT testing and quality assurance indicthreads
PDF
Building & scaling a live streaming mobile platform - Gr8 road to fame
PPTX
Internet of things architecture perspective - IndicThreads Conference
PDF
Cars and Computers: Building a Java Carputer
PPTX
Scrap Your MapReduce - Apache Spark
PPT
Continuous Integration (CI) and Continuous Delivery (CD) using Jenkins & Docker
PPTX
Speed up your build pipeline for faster feedback
PPT
Unraveling OpenStack Clouds
PPTX
Digital Transformation of the Enterprise. What IT leaders need to know!
PDF
Architectural Considerations For Complex Mobile And Web Applications
PPTX
Functional Programming With Lambdas and Streams in JDK8
PDF
Changing application demands: What developers need to know
Http2 is here! And why the web needs it
Understanding Bitcoin (Blockchain) and its Potential for Disruptive Applications
Go Programming Language - Learning The Go Lang way
Building Resilient Microservices
App using golang indicthreads
Building on quicksand microservices indicthreads
Iot secure connected devices indicthreads
Real world IoT for enterprises
IoT testing and quality assurance indicthreads
Building & scaling a live streaming mobile platform - Gr8 road to fame
Internet of things architecture perspective - IndicThreads Conference
Cars and Computers: Building a Java Carputer
Scrap Your MapReduce - Apache Spark
Continuous Integration (CI) and Continuous Delivery (CD) using Jenkins & Docker
Speed up your build pipeline for faster feedback
Unraveling OpenStack Clouds
Digital Transformation of the Enterprise. What IT leaders need to know!
Architectural Considerations For Complex Mobile And Web Applications
Functional Programming With Lambdas and Streams in JDK8
Changing application demands: What developers need to know

Recently uploaded (20)

PDF
AI in Product Development-omnex systems
PDF
How Creative Agencies Leverage Project Management Software.pdf
PPTX
Operating system designcfffgfgggggggvggggggggg
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PDF
System and Network Administration Chapter 2
PDF
Design an Analysis of Algorithms I-SECS-1021-03
PPTX
Essential Infomation Tech presentation.pptx
PDF
Understanding Forklifts - TECH EHS Solution
PDF
PTS Company Brochure 2025 (1).pdf.......
PPTX
history of c programming in notes for students .pptx
PDF
top salesforce developer skills in 2025.pdf
PPTX
ai tools demonstartion for schools and inter college
PDF
medical staffing services at VALiNTRY
PDF
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
PPTX
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PPTX
Odoo POS Development Services by CandidRoot Solutions
PPTX
L1 - Introduction to python Backend.pptx
PDF
Softaken Excel to vCard Converter Software.pdf
AI in Product Development-omnex systems
How Creative Agencies Leverage Project Management Software.pdf
Operating system designcfffgfgggggggvggggggggg
Internet Downloader Manager (IDM) Crack 6.42 Build 41
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
System and Network Administration Chapter 2
Design an Analysis of Algorithms I-SECS-1021-03
Essential Infomation Tech presentation.pptx
Understanding Forklifts - TECH EHS Solution
PTS Company Brochure 2025 (1).pdf.......
history of c programming in notes for students .pptx
top salesforce developer skills in 2025.pdf
ai tools demonstartion for schools and inter college
medical staffing services at VALiNTRY
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
Odoo POS Development Services by CandidRoot Solutions
L1 - Introduction to python Backend.pptx
Softaken Excel to vCard Converter Software.pdf

Harnessing the Power of Java 8 Streams

  • 1. Harnessing the power of Java 8 Streams Praveer Gupta
  • 3. helps to make a strategic decision about what programming language should be adopted when starting to build a new software system Java 8 released on Mar 18, 2014
  • 4. –Robert C. Martin “There are two parts to learning craftsmanship: knowledge and work. You must gain the knowledge of principles, patterns, practices, and heuristics that a craftsman knows, and you must also grind that knowledge into your fingers, eyes, and gut by working hard and practicing..”
  • 5. Stream Intermediate Operators Terminal Operators Harnessing the power Java 8 Streams Programming Paradigm Concepts
  • 6. Stream Collectorscollectreduce Intermediate Operators Terminal Operators computation creation Primitive Streams stateless/stateful Lazy & Short-Circuited Harnessing the power Java 8 Streams Declarative Programming Internal Iteration chained categories Programming Paradigm Concepts
  • 7. Harnessing the power Java 8 Streams Declarative Programming Internal Iteration Programming Paradigm Concepts
  • 8. Declarative SELECT NAME FROM PERSON WHERE AGE > 18; List<String> adults = group.stream()
 .filter(p -> p.age() > 18) .map(Person::name)
 .collect(toList()); You declare what the program has to do and the library takes care of how to do it
  • 9. Declarative Focuses on What List<String> adults = new ArrayList<>();
 for (Person person: group) 
 if (person.age() > 18)
 adults.add(person.name()); Focuses on How and What vs Imperative List<String> adults = group.stream()
 .filter(p -> p.age() > 18) .map(Person::name)
 .collect(toList());
  • 10. Old way vs New way final List<String> names = new ArrayList<>();
 for (Person p : group)
 if (p.age() > 18) names.add(p.name());
 return names; return group.stream()
 .filter(p -> p.age() > 18)
 .map(Person::name)
 .collect(toList()); List<String> namesOfAdultsInTheGroup(List<Person> group) { } External Iteration Internal Iteration new declarative way old imperative way List<String> namesOfAdultsInTheGroup(List<Person> group) { }
  • 11. Application of Streams interface CustomerRepository {
 List<Customer> findByCity(String cityName);
 } API Definition
  • 12. Application of Streams interface CustomerRepository {
 Stream<Customer> findByCity(String cityName);
 } try (Stream<String> stream = repository.findByCity(“Pune")) {
 return stream.filter(…).count();
 } API Definition Usage of the API Consume items as they arrive Efficient memory usage
  • 13. Stream computation creation Harnessing the power Java 8 Streams Declarative Programming Internal Iteration Programming Paradigm Concepts
  • 14. Stream a read-only sequence of elements computational operations that will be performed in aggregate Collection efficient management of elements efficient access to elements
  • 16. Stream Terminal Operator Operator1 Operator2 Operator3 Stream Pipeline List<String> namesOfAdultsInTheGroup(List<Person> group) {
 return
 
 
 
 } group.stream() .filter(p -> p.age() > 18) .map(Person::name) .collect(Collectors.toList());
  • 17. names group Stream<Person> Archer (22 years) Barbara (17 years) Daisy (25 years) is person’s age > 18 ? Stream<Person> Stream<String> map to name of person collect into a list group.stream() .filter(p -> p.age() > 18) .map(Person::name) .collect( Collectors.toList()); Archer (22 years) Barbara (17 years) Daisy (25 years) Archer (22 years) Daisy (25 years) Archer Daisy Archer Daisy
  • 18. Creating Stream From Collection List<String> list = Arrays.asList("a", "b", "c");
 Stream<String> stream = list.stream(); String[] array = {"a", "b", "c"};
 Stream<String> stream = Arrays.stream(array);
  • 19. Creating Stream From an I/O Channel try (Stream<Path> stream = Files.list(Paths.get(“.”));) { … } Stream interface extends AutoCloseable
  • 20. Creating Stream Using Generator Functions Stream<Double> stream = Stream.generate(Math::random); Stream<Integer> stream = Stream.iterate(0, n -> n + 3); Both are unbounded
  • 21. Parallel Stream From Collection List<String> list = Arrays.asList("a", "b", "c");
 Stream<String> stream = list.parallelStream(); From another Stream Stream<String> parallelStream = stream.parallel(); List<String> list = Arrays.asList("a", "b", "c");
 Stream<String> stream = list.parallelStream(); Stream<String> parallelStream = stream.parallel();
  • 22. Parallel Stream How does it work? Splitting Combining Parallel Processing
  • 23. Parallel Stream Performance Impact Always measure performance before using parallel Stream size predictability & Amount of data Decomposability of source data structure Computational Cost
  • 24. Stream Intermediate Operators computation creation stateless/stateful Harnessing the power Java 8 Streams Declarative Programming Internal Iteration chained categories Programming Paradigm Concepts
  • 26. Intermediate Operators Categories Stream<Integer> stream = Stream.of(3, 2, 1); Stream<Integer> filtered = stream.filter(n -> n % 2 == 0); Filtering Type of stream remains the same Stream<Integer> filtered = stream.filter(n -> n % 2 == 0);
  • 27. Intermediate Operators Categories Stream<Integer> stream = Stream.of(3, 2, 1); Stream<String> mapped = stream.map(Object::toString); Mapping Type of stream gets altered (here Integer to String) Stream<String> mapped = stream.map(Object::toString);
  • 28. Intermediate Operators Categories Stream<Integer> stream = Stream.of(3, 2, 1); Stream<Integer> sliced = stream.limit(1); Slicing Type of stream remains the same Stream<Integer> sliced = stream.limit(1);
  • 29. Stream.of(1, 2, 3, 4)
 .peek(System.out::println)
 .filter(n -> n % 2 == 0); Intermediate Operators Laziness Stream.of(1, 2, 3, 4)
 .peek(System.out::println)
 .filter(n -> n % 2 == 0)
 .collect(toList()); Stream.of(1, 2, 3, 4)
 .peek(System.out::println)
 .filter(n -> n % 2 == 0); Terminal operator is required to start stream processing Stream.of(1, 2, 3, 4)
 .peek(System.out::println)
 .filter(n -> n % 2 == 0)
 .collect(toList()); Peek will not print anything
  • 30. Intermediate Operators Short-Circuiting Stream.of(1, 2, 3, 4)
 .peek(System.out::println)
 .filter(n -> n % 2 == 0)
 .findFirst(); Stream will get short-circuited after the first element is found Peek will print only 1 & 2 Stream.of(1, 2, 3, 4)
 .peek(System.out::println)
 .filter(n -> n % 2 == 0)
 .findFirst();
  • 31. Intermediate Operators Stateless vs Stateful Stream.of(1, 2, 3, 4)
 .peek(System.out::println)
 .filter(n -> n % 2 == 0)
 .findFirst(); Stream.of(1, 2, 3, 4)
 .peek(System.out::println)
 .sorted(Comparator.reverseOrder())
 .filter(n -> n % 2 == 0)
 .findFirst(); Will cause the whole stream to be traversed All operations are done on current value in stream Stream.of(1, 2, 3, 4)
 .peek(System.out::println)
 .sorted(Comparator.reverseOrder())
 .filter(n -> n % 2 == 0)
 .findFirst();
  • 32. Stream Collectorscollectreduce Intermediate Operators Terminal Operators computation creation stateless/stateful Lazy & Short-Circuited Harnessing the power Java 8 Streams Declarative Programming Internal Iteration chained categories Programming Paradigm Concepts
  • 33. Terminal Operators Single Value Collection Reduce Operation Collect Operation
  • 34. Terminal Operators reduce <U> U reduce(U identity,
 BiFunction<U, ? super T, U> accumulator,
 BinaryOperator<U> combiner); Stream.of(3, 2, 1).reduce(0, Integer::sum, Integer::sum); Stream.of(3, 2, 1).reduce(0, Integer::sum); Immutable Reduction Process <U> U reduce(U identity,
 BiFunction<U, ? super T, U> accumulator,
 BinaryOperator<U> combiner); <U> U reduce(U identity,
 BiFunction<U, ? super T, U> accumulator,
 BinaryOperator<U> combiner); <U> U reduce(U identity,
 BiFunction<U, ? super T, U> accumulator,
 BinaryOperator<U> combiner);
  • 35. Terminal Operators reduce utility methods Optional<Integer> max = Stream.of(1, 2, 3) .max(Comparator.naturalOrder()); boolean result = Stream.of(1, 2, 3) .anyMatch(n -> n > 2); Optional<Integer> max = Stream.of(1, 2, 3) .max(Comparator.naturalOrder()); boolean result = Stream.of(1, 2, 3) .anyMatch(n -> n > 2);
  • 36. Terminal Operators collect Mutable Reduction Process Accumulates elements into a mutable result container Stream.of("a", "b", "c").reduce("", String::concat); String copying = Low Performance !!
  • 37. Terminal Operators collect <R> R collect(Supplier<R> supplier,
 BiConsumer<R, ? super T> accumulator,
 BiConsumer<R, R> combiner); StringBuilder builder = Stream.of("a", "b", "c").collect(
 StringBuilder::new, 
 StringBuilder::append, 
 StringBuilder::append
 ); StringBuilder is the mutable container here
  • 38. Terminal Operators Collectors class String joinedString = Stream.of(“a", "b", “c") .collect(Collectors.joining(", ")); IntSummaryStatistics statistics = group.stream() .collect(Collectors.summarizingInt(Person::age)); IntSummaryStatistics{count=10, sum=280, min=26, average=28.000000, max=30} Output: a, b, c String joinedString = Stream.of(“a", "b", “c") .collect(Collectors.joining(", ")); IntSummaryStatistics statistics = group.stream() .collect(Collectors.summarizingInt(Person::age));
  • 39. Terminal Operators Downstream Collectors Map<Integer, List<Person>> result = group.stream() .collect(Collectors.groupingBy(Person::age,
 Collectors.toList())); Map<Integer, List<Person>> result = group.stream() .collect(groupingBy(Person::age)); Divide into different age groups
  • 40. Terminal Operators Downstream Collectors Map<Integer, Long> result = group.stream() .collect(groupingBy(Person::age, counting())); Map<Integer, List<String>> result = group.stream() .collect(groupingBy(Person::age,
 mapping(Person::name, toList()))); Count of people in each age group Names on people in each age group
  • 41. Stream Collectorscollectreduce Intermediate Operators Terminal Operators computation creation Primitive Streams stateless/stateful Lazy & Short-Circuited Harnessing the power Java 8 Streams Declarative Programming Internal Iteration chained categories Programming Paradigm Concepts
  • 42. Primitive Streams IntStream DoubleStreamLongStream Avoid boxing and unboxing costs Numeric operations are available XXXFunction XXXPredicateXXXSupplierXXXConsumer XXXToXXXFunction Primitive Functional Interfaces
  • 43. Primitive Streams Creating from factory methods IntStream intStream = IntStream.range(1, 10); DoubleStream doubleStream = DoubleStream.of(1.0, 2.0); LongStream longStream = LongStream.iterate(0L, n -> n + 4); Generating a range of numbers Stream of known set of numbers Stream using iterative application of a function
  • 44. Stream<Person> stream = group.stream(); Primitive Streams Obtaining from Stream<T> mapToXXX flatMapToXXX IntStream intStream = stream.mapToInt(Person::age); OptionalDouble averageAge = intStream.average(); Specialized methods on Primitive Streams IntStream intStream = stream.mapToInt(Person::age);
  • 45. Primitive Streams Converting back to Stream<T> Stream<Integer> boxed = IntStream.of(1, 2, 3).boxed();Stream<Integer> boxed = IntStream.of(1, 2, 3).boxed();
  • 46. Stream Collectorscollectreduce Intermediate Operators Terminal Operators computation creation Primitive Streams stateless/stateful Lazy & Short-Circuited Harnessing the power Java 8 Streams Declarative Programming Internal Iteration chained categories Programming Paradigm Concepts