SlideShare a Scribd company logo
Java 8 Stream API
Outline
• Stream Building Blocks
– Java 8
– Default Methods
– Functional Interfaces
– Lambda Expressions
– Method References
Outline
• Characteristics of Streams
• Creating Streams
• Common Functional Interfaces Used
• Anatomy of the Stream pipeline
• Optional Class
• Common Stream API Methods Used
– Examples
• Parallel Streams
• Unbounded (On the Fly) Streams
• What Could Streams Do For BMI
• References
• Questions?
Java 8
• Target Release Date: 03/18/14
• Introduces
– Default Methods
– Functional Interfaces
– Lambda Expressions
– Stream API and overall improvements to
Collections to support Streams
Default Methods
• In Context of Support For Streams
– Java 8 needed to add functionality to existing
Collection interfaces to support Streams (stream(),
forEach())
Default Methods
• Problem
– Pre-Java 8 interfaces couldn’t have method
bodies.
– The only way to add functionality to Interfaces
was to declare additional methods which would
be implemented in classes that implement the
interface
– It is impossible to add methods to an interface
without breaking the existing implementation
Default Methods
• Solution
– Default Methods!
– Java 8 allows default methods to be added to
interfaces with their full implementation
– Classes which implement the interface don’t have
to have implementations of the default method
– Allows the addition of functionality to interfaces
while preserving backward compatibility
Default Methods
• Example
public interface A {
default void foo(){
System.out.println("Calling A.foo()");
}
public class Clazz implements A {}
Clazz clazz = new Clazz();
clazz.foo(); // Calling A.foo()
Functional Interfaces
• Interfaces with only one abstract method.
• With only one abstract method, these
interfaces can be easily represented with
lambda expressions
• Example
@FunctionalInterface
public interface SimpleFuncInterface {
public void doWork();
}
Lambda expressions
• A more brief and clearly expressive way to implement functional interfaces
• Format: <Argument List> -> <Body>
• Example (Functional Interface)
public interface Predicate<T> {
boolean test(T input);
}
• Example (Static Method)
public static <T> Collection<T> filter(Predicate<T> predicate,
Collection<T> items) {
Collection<T> result = new ArrayList<T>();
for(T item: items) {
if(predicate.test(item)) {
result.add(item);
}
}
}
• Example (Call with Lambda Expression)
Collection<Integer> myInts = asList(0,1,2,3,4,5,6,7,8,9);
Collection<Integer> onlyOdds = filter(n -> n % 2 != 0, myInts)
Method References
• Event more brief and clearly expressive way to implement
functional interfaces
• Format: <Class or Instance>::<Method>
• Example (Functional Interface)
public interface IntPredicates {
boolean isOdd(Integer n) { return n % 2 != 0; }
}
• Example (Call with Lambda Expression)
List<Integer> numbers = asList(1,2,3,4,5,6,7,8,9);
List<Integer> odds = filter(n -> IntPredicates.isOdd(n), numbers);
• Example (Call with Method Reference)
List<Integer> numbers = asList(1,2,3,4,5,6,7,8,9);
List<Integer> odds = filter(IntPredicates::isOdd, numbers);
Characteristics of Streams
• Streams are not related to InputStreams, OutputStreams, etc.
• Streams are NOT data structures but are wrappers around
Collection that carry values from a source through a pipeline of
operations.
• Streams are more powerful, faster and more memory efficient than
Lists
• Streams are designed for lambdas
• Streams can easily be output as arrays or lists
• Streams employ lazy evaluation
• Streams are parallelizable
• Streams can be “on-the-fly”
Creating Streams
• From individual values
– Stream.of(val1, val2, …)
• From array
– Stream.of(someArray)
– Arrays.stream(someArray)
• From List (and other Collections)
– someList.stream()
– someOtherCollection.stream()
Common Functional Interfaces Used
• Predicate<T>
– Represents a predicate (boolean-valued function) of one argument
– Functional method is boolean Test(T t)
• Evaluates this Predicate on the given input argument (T t)
• Returns true if the input argument matches the predicate, otherwise false
• Supplier<T>
– Represents a supplier of results
– Functional method is T get()
• Returns a result of type T
• Function<T,R>
– Represents a function that accepts one argument and produces a result
– Functional method is R apply(T t)
• Applies this function to the given argument (T t)
• Returns the function result
• Consumer<T>
– Represents an operation that accepts a single input and returns no result
– Functional method is void accept(T t)
• Performs this operation on the given argument (T t)
Common Functional Interfaces Used
• Function<T,R>
– Represents an operation that accepts one argument and produces
a result
– Functional method is R apply(T t)
• Applies this function to the given argument (T t)
• Returns the function result
• UnaryOperator<T>
– Represents an operation on a single operands that produces a
result of the same type as its operand
– Functional method is R Function.apply(T t)
• Applies this function to the given argument (T t)
• Returns the function result
Common Functional Interfaces Used
• BiFunction<T,U,R>
– Represents an operation that accepts two arguments and produces a result
– Functional method is R apply(T t, U u)
• Applies this function to the given arguments (T t, U u)
• Returns the function result
• BinaryOperator<T>
– Extends BiFunction<T, U, R>
– Represents an operation upon two operands of the same type, producing a result of the same type
as the operands
– Functional method is R BiFunction.apply(T t, U u)
• Applies this function to the given arguments (T t, U u) where R,T and U are of the same type
• Returns the function result
• Comparator<T>
– Compares its two arguments for order.
– Functional method is int compareTo(T o1, T o2)
• Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or
greater than the second.
Anatomy of the Stream Pipeline
• A Stream is processed through a pipeline of operations
• A Stream starts with a source data structure
• Intermediate methods are performed on the Stream
elements. These methods produce Streams and are not
processed until the terminal method is called.
• The Stream is considered consumed when a terminal
operation is invoked. No other operation can be performed on
the Stream elements afterwards
• A Stream pipeline contains some short-circuit methods (which
could be intermediate or terminal methods) that cause the
earlier intermediate methods to be processed only until the
short-circuit method can be evaluated.
Anatomy of the Stream Pipeline
• Intermediate Methods
map, filter, distinct, sorted, peek, limit,
parallel
• Terminal Methods
forEach, toArray, reduce, collect, min,
max, count, anyMatch, allMatch, noneMatch, findFirst,
findAny, iterator
• Short-circuit Methods
anyMatch, allMatch, noneMatch, findFirst, findAny,limit
Optional<T> Class
• A container which may or may not
contain a non-null value
• Common methods
– isPresent() – returns true if value is present
– Get() – returns value if present
– orElse(T other) – returns value if present, or
other
– ifPresent(Consumer) – runs the lambda if value
is present
Common Stream API Methods Used
• Void forEach(Consumer)
–Easy way to loop over Stream elements
–You supply a lambda for forEach and that
lambda is called on each element of the
Stream
–Related peek method does the exact
same thing, but returns the original
Stream
Common Stream API Methods Used
• Void forEach(Consumer)
–Example
Employees.forEach(e ->
e.setSalary(e.getSalary() * 11/10))
Give all employees a 10% raise
Common Stream API Methods Used
• Void forEach(Consumer)
–Vs. For Loops
List<Employee> employees = getEmployees();
for(Employee e: employees) {
e.setSalary(e.getSalary() * 11/10);
}
–Advantages of forEach
• Designed for lambdas to be marginally more succinct
• Lambdas are reusable
• Can be made parallel with minimal effort
Common Stream API Methods Used
• Stream<T> map(Function)
–Produces a new Stream that is the result
of applying a Function to each element of
original Stream
–Example
Ids.map(EmployeeUtils::findEmployeeById)
Create a new Stream of Employee ids
Common Stream API Methods Used
• Stream<T> filter(Predicate)
–Produces a new Stream that contains
only the elements of the original Stream
that pass a given test
–Example
employees.filter(e -> e.getSalary() > 100000)
Produce a Stream of Employees with a high
salary
Common Stream API Methods Used
• Optional<T> findFirst()
–Returns an Optional for the first entry in
the Stream
–Example
employees.filter(…).findFirst().orElse(Consul
tant)
Get the first Employee entry that passes the
filter
Common Stream API Methods Used
• Object[] toArray(Supplier)
–Reads the Stream of elements into a an
array
–Example
Employee[] empArray =
employees.toArray(Employee[]::new);
Create an array of Employees out of the
Stream of Employees
Common Stream API Methods Used
• List<T> collect(Collectors.toList())
• Reads the Stream of elements into a List or any
other collection
– Example
List<Employee> empList =
employees.collect(Collectors.toList());
Create a List of Employees out of the Stream of
Employees
Common Stream API Methods Used
• List<T> collect(Collectors.toList())
– partitioningBy
• You provide a Predicate. It builds a Map where true maps to a List
of entries that passed the Predicate, and false maps to a List that
failed the Predicate.
• Example
Map<Boolean,List<Employee>> richTable =
googlers().collect
(partitioningBy(e -> e.getSalary() > 1000000));
– groupingBy
• You provide a Function. It builds a Map where each output value
of the Function maps to a List of entries that gave that value.
• Example
Map<Department,List<Employee>> deptTable =
employeeStream().collect(groupingBy(Employee::getDepartment));
Common Stream API Methods Used
• T reduce(T identity, BinaryOperator)
• You start with a seed (identity) value, then combine
this value with the first Entry in the Stream, combine
the second entry of the Stream, etc.
– Example
Nums.stream().reduce(1, (n1,n2) -> n1*n2)
Calculate the product of numbers
• IntStream (Stream on primative int] has build-in
sum()
• Built-in Min, Max methods
Common Stream API Methods Used
• Stream<T> limit(long
maxSize)
• Limit(n) returns a stream of the first n
elements
–Example
someLongStream.limit(10)
First 10 elements
Common Stream API Methods Used
•Stream<T> skip(long n)
• skip(n) returns a stream starting
with element n
–Example
twentyElementStream.skip(5)
Last 15 elements
Common Stream API Methods Used
• Stream<T> sorted(Comparator)
– Returns a stream consisting of the elements of
this stream, sorted according to the provided
Comparator
– Example
empStream.map(…).filter(…).limit(…)
.sorted((e1, e2) -> e1.getSalary() -
e2.getSalary())
Employees sorted by salary
Common Stream API Methods Used
• Optional<T> min(Comparator)
– Returns the minimum element in this Stream according to the
Comparator
– Example
Employee alphabeticallyFirst =
ids.stream().map(EmployeeSamples::findGoogler)
.min((e1, e2) ->
e1.getLastName()
.compareTo(e2.getLastName()))
.get();
Get Googler with earliest lastName
Common Stream API Methods Used
• Optional<T> max(Comparator)
– Returns the minimum element in this Stream according to
the Comparator
– Example
Employee richest =
ids.stream().map(EmployeeSamples::findGoogler)
.max((e1, e2) -> e1.getSalary() -
e2.getSalary())
.get();
Get Richest Employee
Common Stream API Methods Used
• Stream<T> distinct()
– Returns a stream consisting of the distinct elements of this stream
– Example
List<Integer> ids2 =
Arrays.asList(9, 10, 9, 10, 9, 10);
List<Employee> emps4 =
ids2.stream().map(EmployeeSamples::findGoogler)
.distinct()
.collect(toList());
Get a list of distinct Employees
Common Stream API Methods Used
• Boolean anyMatch(Predicate), allMatch(Predicate),
noneMatch(Predicate)
– Returns true if Stream passes, false otherwise
– Lazy Evaluation
• anyMatch processes elements in the Stream one element at a time until it finds a
match according to the Predicate and returns true if it found a match
• allMatch processes elements in the Stream one element at a time until it fails a
match according to the Predicate and returns false if an element failed the
Predicate
• noneMatch processes elements in the Stream one element at a time until it finds a
match according to the Predicate and returns false if an element matches the
Predicate
– Example
employeeStream.anyMatch(e -> e.getSalary() > 500000)
Is there a rich Employee among all Employees?
Common Stream API Methods Used
• long count()
– Returns the count of elements in the Stream
– Example
employeeStream.filter(somePredicate).c
ount()
How many Employees match the
criteria?
Parallel Streams
• Helper Methods For Timing
private static void timingTest(Stream<Employee> testStream) {
long startTime = System.nanoTime();
testStream.forEach(e -> doSlowOp());
long endTime = System.nanoTime();
System.out.printf(" %.3f seconds.%n",
deltaSeconds(startTime, endTime));
}
private static double deltaSeconds(long startTime, long endTime) {
return((endTime - startTime) / 1000000000);
}
Parallel Streams
• Helper Method For Simulating Long Operation
void doSlowOp() {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException ie) {
// Nothing to do here.
}
}
Parallel Streams
• Main Code
System.out.print("Serial version [11 entries]:");
timingTest(googlers());
int numProcessorsOrCores =
Runtime.getRuntime().availableProcessors();
System.out.printf("Parallel version on %s-core
machine:",
numProcessorsOrCores);
timingTest(googlers().parallel() );
Parallel Streams
•Results
Serial version [11 entries]:
11.000 seconds.
Parallel version on 4-core
machine: 3.000 seconds.
(On The Fly) Streams
• Stream<T> generate(Supplier)
– The method lets you specify a Supplier
– This Supplier is invoked each time the system needs a Stream element
– Example
List<Employee> emps =
Stream.generate(() -> randomEmployee())
.limit(n)
.collect(toList());
• Stream<T> iterate(T seed, UnaryOperator<T> f)
– The method lets you specify a seed and a UnaryOperator.
– The seed becomes the first element of the Stream, f(seed) becomes the second element of the Stream,
f(second) becomes the third element, etc.
– Example
List<Integer> powersOfTwo =
Stream.iterate(1, n -> n * 2)
.limit(n)
.collect(toList());
• The values are not calculated until they are needed
• To avoid unterminated processing, you must eventually use a size-limiting method
• This is less of an actual Unbounded Stream and more of an “On The Fly” Stream
References
• Stream API
– http://download.java.net/jdk8/docs/api/java/util/stream/S
tream.html
• Java 8 Explained: Applying Lambdas to Java Collections
– http://zeroturnaround.com/rebellabs/java-8-explained-
applying-lambdas-to-java-collections/
• Java 8 first steps with Lambdas and Streams
– https://blog.codecentric.de/en/2013/10/java-8-first-steps-
lambdas-streams/
• Java 8Tutorial: Lambda Expressions, Streams, and More
– http://www.coreservlets.com/java-8-tutorial/
Questions?

More Related Content

What's hot

Introduction to Java 8
Introduction to Java 8Introduction to Java 8
Introduction to Java 8
Knoldus Inc.
 
Spring Boot
Spring BootSpring Boot
Spring Boot
Pei-Tang Huang
 
Building a REST Service in minutes with Spring Boot
Building a REST Service in minutes with Spring BootBuilding a REST Service in minutes with Spring Boot
Building a REST Service in minutes with Spring Boot
Omri Spector
 
Spring boot introduction
Spring boot introductionSpring boot introduction
Spring boot introduction
Rasheed Waraich
 
java 8 new features
java 8 new features java 8 new features
java 8 new features
Rohit Verma
 
Spring Data JPA from 0-100 in 60 minutes
Spring Data JPA from 0-100 in 60 minutesSpring Data JPA from 0-100 in 60 minutes
Spring Data JPA from 0-100 in 60 minutes
VMware Tanzu
 
Java 8 features
Java 8 featuresJava 8 features
Java 8 features
NexThoughts Technologies
 
Spring Boot
Spring BootSpring Boot
Spring Boot
Jaran Flaath
 
Spring Boot
Spring BootSpring Boot
Spring Boot
Jiayun Zhou
 
Testing with Spring: An Introduction
Testing with Spring: An IntroductionTesting with Spring: An Introduction
Testing with Spring: An Introduction
Sam Brannen
 
Spring Boot & Actuators
Spring Boot & ActuatorsSpring Boot & Actuators
Spring Boot & Actuators
VMware Tanzu
 
Java 8-streams-collectors-patterns
Java 8-streams-collectors-patternsJava 8-streams-collectors-patterns
Java 8-streams-collectors-patterns
José Paumard
 
Java8 features
Java8 featuresJava8 features
Java8 features
Elias Hasnat
 
Spring boot - an introduction
Spring boot - an introductionSpring boot - an introduction
Spring boot - an introduction
Jonathan Holloway
 
Java 8 Lambda Built-in Functional Interfaces
Java 8 Lambda Built-in Functional InterfacesJava 8 Lambda Built-in Functional Interfaces
Java 8 Lambda Built-in Functional Interfaces
Ganesh Samarthyam
 
Streams in Java 8
Streams in Java 8Streams in Java 8
Streams in Java 8
Tobias Coetzee
 
java Servlet technology
java Servlet technologyjava Servlet technology
java Servlet technology
Tanmoy Barman
 
Java 8 Lambda Expressions
Java 8 Lambda ExpressionsJava 8 Lambda Expressions
Java 8 Lambda Expressions
Scott Leberknight
 
Spring boot
Spring bootSpring boot
Spring boot
sdeeg
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring boot
Antoine Rey
 

What's hot (20)

Introduction to Java 8
Introduction to Java 8Introduction to Java 8
Introduction to Java 8
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
Building a REST Service in minutes with Spring Boot
Building a REST Service in minutes with Spring BootBuilding a REST Service in minutes with Spring Boot
Building a REST Service in minutes with Spring Boot
 
Spring boot introduction
Spring boot introductionSpring boot introduction
Spring boot introduction
 
java 8 new features
java 8 new features java 8 new features
java 8 new features
 
Spring Data JPA from 0-100 in 60 minutes
Spring Data JPA from 0-100 in 60 minutesSpring Data JPA from 0-100 in 60 minutes
Spring Data JPA from 0-100 in 60 minutes
 
Java 8 features
Java 8 featuresJava 8 features
Java 8 features
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
Testing with Spring: An Introduction
Testing with Spring: An IntroductionTesting with Spring: An Introduction
Testing with Spring: An Introduction
 
Spring Boot & Actuators
Spring Boot & ActuatorsSpring Boot & Actuators
Spring Boot & Actuators
 
Java 8-streams-collectors-patterns
Java 8-streams-collectors-patternsJava 8-streams-collectors-patterns
Java 8-streams-collectors-patterns
 
Java8 features
Java8 featuresJava8 features
Java8 features
 
Spring boot - an introduction
Spring boot - an introductionSpring boot - an introduction
Spring boot - an introduction
 
Java 8 Lambda Built-in Functional Interfaces
Java 8 Lambda Built-in Functional InterfacesJava 8 Lambda Built-in Functional Interfaces
Java 8 Lambda Built-in Functional Interfaces
 
Streams in Java 8
Streams in Java 8Streams in Java 8
Streams in Java 8
 
java Servlet technology
java Servlet technologyjava Servlet technology
java Servlet technology
 
Java 8 Lambda Expressions
Java 8 Lambda ExpressionsJava 8 Lambda Expressions
Java 8 Lambda Expressions
 
Spring boot
Spring bootSpring boot
Spring boot
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring boot
 

Similar to Java 8 streams

Java8
Java8Java8
Charles Sharp: Java 8 Streams
Charles Sharp: Java 8 StreamsCharles Sharp: Java 8 Streams
Charles Sharp: Java 8 Streams
jessitron
 
Java 8 new features
Java 8 new featuresJava 8 new features
Java 8 new features
Aniket Thakur
 
Java 8 Feature Preview
Java 8 Feature PreviewJava 8 Feature Preview
Java 8 Feature Preview
Jim Bethancourt
 
Java 8 Intro - Core Features
Java 8 Intro - Core FeaturesJava 8 Intro - Core Features
Java 8 Intro - Core Features
GlobalLogic Ukraine
 
New Functional Features of Java 8
New Functional Features of Java 8New Functional Features of Java 8
New Functional Features of Java 8
franciscoortin
 
Functional Programming in Swift
Functional Programming in SwiftFunctional Programming in Swift
Functional Programming in Swift
Saugat Gautam
 
Lambdas and Laughs
Lambdas and LaughsLambdas and Laughs
Lambdas and Laughs
Jim Bethancourt
 
Java 8
Java 8Java 8
Java 8vpulec
 
Java 8 Functional Programming - I
Java 8 Functional Programming - IJava 8 Functional Programming - I
Java 8 Functional Programming - I
Ugur Yeter
 
Java8lambda
Java8lambda Java8lambda
Java8lambda
Isuru Samaraweera
 
Java 8 - Project Lambda
Java 8 - Project LambdaJava 8 - Project Lambda
Java 8 - Project Lambda
Rahman USTA
 
Java 8 presentation
Java 8 presentationJava 8 presentation
Java 8 presentation
Van Huong
 
Java 8 ​and ​Best Practices
Java 8 ​and ​Best PracticesJava 8 ​and ​Best Practices
Java 8 ​and ​Best Practices
Buddhini Seneviratne
 
Java 8 ​and ​Best Practices
Java 8 ​and ​Best PracticesJava 8 ​and ​Best Practices
Java 8 ​and ​Best Practices
Buddhini Seneviratne
 
Java 8 ​and ​Best Practices
 Java 8 ​and ​Best Practices Java 8 ​and ​Best Practices
Java 8 ​and ​Best Practices
WSO2
 
Exploring Streams and Lambdas in Java8
Exploring Streams and Lambdas in Java8Exploring Streams and Lambdas in Java8
Exploring Streams and Lambdas in Java8
Isuru Samaraweera
 
java150929145120-lva1-app6892 (2).pptx
java150929145120-lva1-app6892 (2).pptxjava150929145120-lva1-app6892 (2).pptx
java150929145120-lva1-app6892 (2).pptx
BruceLee275640
 

Similar to Java 8 streams (20)

Java8
Java8Java8
Java8
 
Charles Sharp: Java 8 Streams
Charles Sharp: Java 8 StreamsCharles Sharp: Java 8 Streams
Charles Sharp: Java 8 Streams
 
Java 8 new features
Java 8 new featuresJava 8 new features
Java 8 new features
 
java8
java8java8
java8
 
Java 8 Feature Preview
Java 8 Feature PreviewJava 8 Feature Preview
Java 8 Feature Preview
 
Java 8 Intro - Core Features
Java 8 Intro - Core FeaturesJava 8 Intro - Core Features
Java 8 Intro - Core Features
 
New Functional Features of Java 8
New Functional Features of Java 8New Functional Features of Java 8
New Functional Features of Java 8
 
Functional Programming in Swift
Functional Programming in SwiftFunctional Programming in Swift
Functional Programming in Swift
 
Lambdas and Laughs
Lambdas and LaughsLambdas and Laughs
Lambdas and Laughs
 
Java 8
Java 8Java 8
Java 8
 
Java8.part2
Java8.part2Java8.part2
Java8.part2
 
Java 8 Functional Programming - I
Java 8 Functional Programming - IJava 8 Functional Programming - I
Java 8 Functional Programming - I
 
Java8lambda
Java8lambda Java8lambda
Java8lambda
 
Java 8 - Project Lambda
Java 8 - Project LambdaJava 8 - Project Lambda
Java 8 - Project Lambda
 
Java 8 presentation
Java 8 presentationJava 8 presentation
Java 8 presentation
 
Java 8 ​and ​Best Practices
Java 8 ​and ​Best PracticesJava 8 ​and ​Best Practices
Java 8 ​and ​Best Practices
 
Java 8 ​and ​Best Practices
Java 8 ​and ​Best PracticesJava 8 ​and ​Best Practices
Java 8 ​and ​Best Practices
 
Java 8 ​and ​Best Practices
 Java 8 ​and ​Best Practices Java 8 ​and ​Best Practices
Java 8 ​and ​Best Practices
 
Exploring Streams and Lambdas in Java8
Exploring Streams and Lambdas in Java8Exploring Streams and Lambdas in Java8
Exploring Streams and Lambdas in Java8
 
java150929145120-lva1-app6892 (2).pptx
java150929145120-lva1-app6892 (2).pptxjava150929145120-lva1-app6892 (2).pptx
java150929145120-lva1-app6892 (2).pptx
 

More from Manav Prasad

Experience with mulesoft
Experience with mulesoftExperience with mulesoft
Experience with mulesoft
Manav Prasad
 
Mulesoftconnectors
MulesoftconnectorsMulesoftconnectors
Mulesoftconnectors
Manav Prasad
 
Mule and web services
Mule and web servicesMule and web services
Mule and web services
Manav Prasad
 
Mulesoft cloudhub
Mulesoft cloudhubMulesoft cloudhub
Mulesoft cloudhub
Manav Prasad
 
Perl tutorial
Perl tutorialPerl tutorial
Perl tutorial
Manav Prasad
 
Hibernate presentation
Hibernate presentationHibernate presentation
Hibernate presentation
Manav Prasad
 
Spring introduction
Spring introductionSpring introduction
Spring introduction
Manav Prasad
 
Json
Json Json
The spring framework
The spring frameworkThe spring framework
The spring framework
Manav Prasad
 
Rest introduction
Rest introductionRest introduction
Rest introduction
Manav Prasad
 
Exceptions in java
Exceptions in javaExceptions in java
Exceptions in java
Manav Prasad
 
Junit
JunitJunit
Xml parsers
Xml parsersXml parsers
Xml parsers
Manav Prasad
 
Xpath
XpathXpath
Xhtml
XhtmlXhtml
Introduction to html5
Introduction to html5Introduction to html5
Introduction to html5
Manav Prasad
 

More from Manav Prasad (20)

Experience with mulesoft
Experience with mulesoftExperience with mulesoft
Experience with mulesoft
 
Mulesoftconnectors
MulesoftconnectorsMulesoftconnectors
Mulesoftconnectors
 
Mule and web services
Mule and web servicesMule and web services
Mule and web services
 
Mulesoft cloudhub
Mulesoft cloudhubMulesoft cloudhub
Mulesoft cloudhub
 
Perl tutorial
Perl tutorialPerl tutorial
Perl tutorial
 
Hibernate presentation
Hibernate presentationHibernate presentation
Hibernate presentation
 
Jpa
JpaJpa
Jpa
 
Spring introduction
Spring introductionSpring introduction
Spring introduction
 
Json
Json Json
Json
 
The spring framework
The spring frameworkThe spring framework
The spring framework
 
Rest introduction
Rest introductionRest introduction
Rest introduction
 
Exceptions in java
Exceptions in javaExceptions in java
Exceptions in java
 
Junit
JunitJunit
Junit
 
Xml parsers
Xml parsersXml parsers
Xml parsers
 
Xpath
XpathXpath
Xpath
 
Xslt
XsltXslt
Xslt
 
Xhtml
XhtmlXhtml
Xhtml
 
Css
CssCss
Css
 
Introduction to html5
Introduction to html5Introduction to html5
Introduction to html5
 
Ajax
AjaxAjax
Ajax
 

Recently uploaded

Railway Signalling Principles Edition 3.pdf
Railway Signalling Principles Edition 3.pdfRailway Signalling Principles Edition 3.pdf
Railway Signalling Principles Edition 3.pdf
TeeVichai
 
block diagram and signal flow graph representation
block diagram and signal flow graph representationblock diagram and signal flow graph representation
block diagram and signal flow graph representation
Divya Somashekar
 
Final project report on grocery store management system..pdf
Final project report on grocery store management system..pdfFinal project report on grocery store management system..pdf
Final project report on grocery store management system..pdf
Kamal Acharya
 
Architectural Portfolio Sean Lockwood
Architectural Portfolio Sean LockwoodArchitectural Portfolio Sean Lockwood
Architectural Portfolio Sean Lockwood
seandesed
 
Planning Of Procurement o different goods and services
Planning Of Procurement o different goods and servicesPlanning Of Procurement o different goods and services
Planning Of Procurement o different goods and services
JoytuBarua2
 
Hierarchical Digital Twin of a Naval Power System
Hierarchical Digital Twin of a Naval Power SystemHierarchical Digital Twin of a Naval Power System
Hierarchical Digital Twin of a Naval Power System
Kerry Sado
 
weather web application report.pdf
weather web application report.pdfweather web application report.pdf
weather web application report.pdf
Pratik Pawar
 
Hybrid optimization of pumped hydro system and solar- Engr. Abdul-Azeez.pdf
Hybrid optimization of pumped hydro system and solar- Engr. Abdul-Azeez.pdfHybrid optimization of pumped hydro system and solar- Engr. Abdul-Azeez.pdf
Hybrid optimization of pumped hydro system and solar- Engr. Abdul-Azeez.pdf
fxintegritypublishin
 
WATER CRISIS and its solutions-pptx 1234
WATER CRISIS and its solutions-pptx 1234WATER CRISIS and its solutions-pptx 1234
WATER CRISIS and its solutions-pptx 1234
AafreenAbuthahir2
 
J.Yang, ICLR 2024, MLILAB, KAIST AI.pdf
J.Yang,  ICLR 2024, MLILAB, KAIST AI.pdfJ.Yang,  ICLR 2024, MLILAB, KAIST AI.pdf
J.Yang, ICLR 2024, MLILAB, KAIST AI.pdf
MLILAB
 
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
MdTanvirMahtab2
 
CME397 Surface Engineering- Professional Elective
CME397 Surface Engineering- Professional ElectiveCME397 Surface Engineering- Professional Elective
CME397 Surface Engineering- Professional Elective
karthi keyan
 
Standard Reomte Control Interface - Neometrix
Standard Reomte Control Interface - NeometrixStandard Reomte Control Interface - Neometrix
Standard Reomte Control Interface - Neometrix
Neometrix_Engineering_Pvt_Ltd
 
一比一原版(IIT毕业证)伊利诺伊理工大学毕业证成绩单专业办理
一比一原版(IIT毕业证)伊利诺伊理工大学毕业证成绩单专业办理一比一原版(IIT毕业证)伊利诺伊理工大学毕业证成绩单专业办理
一比一原版(IIT毕业证)伊利诺伊理工大学毕业证成绩单专业办理
zwunae
 
AKS UNIVERSITY Satna Final Year Project By OM Hardaha.pdf
AKS UNIVERSITY Satna Final Year Project By OM Hardaha.pdfAKS UNIVERSITY Satna Final Year Project By OM Hardaha.pdf
AKS UNIVERSITY Satna Final Year Project By OM Hardaha.pdf
SamSarthak3
 
Investor-Presentation-Q1FY2024 investor presentation document.pptx
Investor-Presentation-Q1FY2024 investor presentation document.pptxInvestor-Presentation-Q1FY2024 investor presentation document.pptx
Investor-Presentation-Q1FY2024 investor presentation document.pptx
AmarGB2
 
ML for identifying fraud using open blockchain data.pptx
ML for identifying fraud using open blockchain data.pptxML for identifying fraud using open blockchain data.pptx
ML for identifying fraud using open blockchain data.pptx
Vijay Dialani, PhD
 
RAT: Retrieval Augmented Thoughts Elicit Context-Aware Reasoning in Long-Hori...
RAT: Retrieval Augmented Thoughts Elicit Context-Aware Reasoning in Long-Hori...RAT: Retrieval Augmented Thoughts Elicit Context-Aware Reasoning in Long-Hori...
RAT: Retrieval Augmented Thoughts Elicit Context-Aware Reasoning in Long-Hori...
thanhdowork
 
ASME IX(9) 2007 Full Version .pdf
ASME IX(9)  2007 Full Version       .pdfASME IX(9)  2007 Full Version       .pdf
ASME IX(9) 2007 Full Version .pdf
AhmedHussein950959
 
ethical hacking in wireless-hacking1.ppt
ethical hacking in wireless-hacking1.pptethical hacking in wireless-hacking1.ppt
ethical hacking in wireless-hacking1.ppt
Jayaprasanna4
 

Recently uploaded (20)

Railway Signalling Principles Edition 3.pdf
Railway Signalling Principles Edition 3.pdfRailway Signalling Principles Edition 3.pdf
Railway Signalling Principles Edition 3.pdf
 
block diagram and signal flow graph representation
block diagram and signal flow graph representationblock diagram and signal flow graph representation
block diagram and signal flow graph representation
 
Final project report on grocery store management system..pdf
Final project report on grocery store management system..pdfFinal project report on grocery store management system..pdf
Final project report on grocery store management system..pdf
 
Architectural Portfolio Sean Lockwood
Architectural Portfolio Sean LockwoodArchitectural Portfolio Sean Lockwood
Architectural Portfolio Sean Lockwood
 
Planning Of Procurement o different goods and services
Planning Of Procurement o different goods and servicesPlanning Of Procurement o different goods and services
Planning Of Procurement o different goods and services
 
Hierarchical Digital Twin of a Naval Power System
Hierarchical Digital Twin of a Naval Power SystemHierarchical Digital Twin of a Naval Power System
Hierarchical Digital Twin of a Naval Power System
 
weather web application report.pdf
weather web application report.pdfweather web application report.pdf
weather web application report.pdf
 
Hybrid optimization of pumped hydro system and solar- Engr. Abdul-Azeez.pdf
Hybrid optimization of pumped hydro system and solar- Engr. Abdul-Azeez.pdfHybrid optimization of pumped hydro system and solar- Engr. Abdul-Azeez.pdf
Hybrid optimization of pumped hydro system and solar- Engr. Abdul-Azeez.pdf
 
WATER CRISIS and its solutions-pptx 1234
WATER CRISIS and its solutions-pptx 1234WATER CRISIS and its solutions-pptx 1234
WATER CRISIS and its solutions-pptx 1234
 
J.Yang, ICLR 2024, MLILAB, KAIST AI.pdf
J.Yang,  ICLR 2024, MLILAB, KAIST AI.pdfJ.Yang,  ICLR 2024, MLILAB, KAIST AI.pdf
J.Yang, ICLR 2024, MLILAB, KAIST AI.pdf
 
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
 
CME397 Surface Engineering- Professional Elective
CME397 Surface Engineering- Professional ElectiveCME397 Surface Engineering- Professional Elective
CME397 Surface Engineering- Professional Elective
 
Standard Reomte Control Interface - Neometrix
Standard Reomte Control Interface - NeometrixStandard Reomte Control Interface - Neometrix
Standard Reomte Control Interface - Neometrix
 
一比一原版(IIT毕业证)伊利诺伊理工大学毕业证成绩单专业办理
一比一原版(IIT毕业证)伊利诺伊理工大学毕业证成绩单专业办理一比一原版(IIT毕业证)伊利诺伊理工大学毕业证成绩单专业办理
一比一原版(IIT毕业证)伊利诺伊理工大学毕业证成绩单专业办理
 
AKS UNIVERSITY Satna Final Year Project By OM Hardaha.pdf
AKS UNIVERSITY Satna Final Year Project By OM Hardaha.pdfAKS UNIVERSITY Satna Final Year Project By OM Hardaha.pdf
AKS UNIVERSITY Satna Final Year Project By OM Hardaha.pdf
 
Investor-Presentation-Q1FY2024 investor presentation document.pptx
Investor-Presentation-Q1FY2024 investor presentation document.pptxInvestor-Presentation-Q1FY2024 investor presentation document.pptx
Investor-Presentation-Q1FY2024 investor presentation document.pptx
 
ML for identifying fraud using open blockchain data.pptx
ML for identifying fraud using open blockchain data.pptxML for identifying fraud using open blockchain data.pptx
ML for identifying fraud using open blockchain data.pptx
 
RAT: Retrieval Augmented Thoughts Elicit Context-Aware Reasoning in Long-Hori...
RAT: Retrieval Augmented Thoughts Elicit Context-Aware Reasoning in Long-Hori...RAT: Retrieval Augmented Thoughts Elicit Context-Aware Reasoning in Long-Hori...
RAT: Retrieval Augmented Thoughts Elicit Context-Aware Reasoning in Long-Hori...
 
ASME IX(9) 2007 Full Version .pdf
ASME IX(9)  2007 Full Version       .pdfASME IX(9)  2007 Full Version       .pdf
ASME IX(9) 2007 Full Version .pdf
 
ethical hacking in wireless-hacking1.ppt
ethical hacking in wireless-hacking1.pptethical hacking in wireless-hacking1.ppt
ethical hacking in wireless-hacking1.ppt
 

Java 8 streams

  • 2. Outline • Stream Building Blocks – Java 8 – Default Methods – Functional Interfaces – Lambda Expressions – Method References
  • 3. Outline • Characteristics of Streams • Creating Streams • Common Functional Interfaces Used • Anatomy of the Stream pipeline • Optional Class • Common Stream API Methods Used – Examples • Parallel Streams • Unbounded (On the Fly) Streams • What Could Streams Do For BMI • References • Questions?
  • 4. Java 8 • Target Release Date: 03/18/14 • Introduces – Default Methods – Functional Interfaces – Lambda Expressions – Stream API and overall improvements to Collections to support Streams
  • 5. Default Methods • In Context of Support For Streams – Java 8 needed to add functionality to existing Collection interfaces to support Streams (stream(), forEach())
  • 6. Default Methods • Problem – Pre-Java 8 interfaces couldn’t have method bodies. – The only way to add functionality to Interfaces was to declare additional methods which would be implemented in classes that implement the interface – It is impossible to add methods to an interface without breaking the existing implementation
  • 7. Default Methods • Solution – Default Methods! – Java 8 allows default methods to be added to interfaces with their full implementation – Classes which implement the interface don’t have to have implementations of the default method – Allows the addition of functionality to interfaces while preserving backward compatibility
  • 8. Default Methods • Example public interface A { default void foo(){ System.out.println("Calling A.foo()"); } public class Clazz implements A {} Clazz clazz = new Clazz(); clazz.foo(); // Calling A.foo()
  • 9. Functional Interfaces • Interfaces with only one abstract method. • With only one abstract method, these interfaces can be easily represented with lambda expressions • Example @FunctionalInterface public interface SimpleFuncInterface { public void doWork(); }
  • 10. Lambda expressions • A more brief and clearly expressive way to implement functional interfaces • Format: <Argument List> -> <Body> • Example (Functional Interface) public interface Predicate<T> { boolean test(T input); } • Example (Static Method) public static <T> Collection<T> filter(Predicate<T> predicate, Collection<T> items) { Collection<T> result = new ArrayList<T>(); for(T item: items) { if(predicate.test(item)) { result.add(item); } } } • Example (Call with Lambda Expression) Collection<Integer> myInts = asList(0,1,2,3,4,5,6,7,8,9); Collection<Integer> onlyOdds = filter(n -> n % 2 != 0, myInts)
  • 11. Method References • Event more brief and clearly expressive way to implement functional interfaces • Format: <Class or Instance>::<Method> • Example (Functional Interface) public interface IntPredicates { boolean isOdd(Integer n) { return n % 2 != 0; } } • Example (Call with Lambda Expression) List<Integer> numbers = asList(1,2,3,4,5,6,7,8,9); List<Integer> odds = filter(n -> IntPredicates.isOdd(n), numbers); • Example (Call with Method Reference) List<Integer> numbers = asList(1,2,3,4,5,6,7,8,9); List<Integer> odds = filter(IntPredicates::isOdd, numbers);
  • 12. Characteristics of Streams • Streams are not related to InputStreams, OutputStreams, etc. • Streams are NOT data structures but are wrappers around Collection that carry values from a source through a pipeline of operations. • Streams are more powerful, faster and more memory efficient than Lists • Streams are designed for lambdas • Streams can easily be output as arrays or lists • Streams employ lazy evaluation • Streams are parallelizable • Streams can be “on-the-fly”
  • 13. Creating Streams • From individual values – Stream.of(val1, val2, …) • From array – Stream.of(someArray) – Arrays.stream(someArray) • From List (and other Collections) – someList.stream() – someOtherCollection.stream()
  • 14. Common Functional Interfaces Used • Predicate<T> – Represents a predicate (boolean-valued function) of one argument – Functional method is boolean Test(T t) • Evaluates this Predicate on the given input argument (T t) • Returns true if the input argument matches the predicate, otherwise false • Supplier<T> – Represents a supplier of results – Functional method is T get() • Returns a result of type T • Function<T,R> – Represents a function that accepts one argument and produces a result – Functional method is R apply(T t) • Applies this function to the given argument (T t) • Returns the function result • Consumer<T> – Represents an operation that accepts a single input and returns no result – Functional method is void accept(T t) • Performs this operation on the given argument (T t)
  • 15. Common Functional Interfaces Used • Function<T,R> – Represents an operation that accepts one argument and produces a result – Functional method is R apply(T t) • Applies this function to the given argument (T t) • Returns the function result • UnaryOperator<T> – Represents an operation on a single operands that produces a result of the same type as its operand – Functional method is R Function.apply(T t) • Applies this function to the given argument (T t) • Returns the function result
  • 16. Common Functional Interfaces Used • BiFunction<T,U,R> – Represents an operation that accepts two arguments and produces a result – Functional method is R apply(T t, U u) • Applies this function to the given arguments (T t, U u) • Returns the function result • BinaryOperator<T> – Extends BiFunction<T, U, R> – Represents an operation upon two operands of the same type, producing a result of the same type as the operands – Functional method is R BiFunction.apply(T t, U u) • Applies this function to the given arguments (T t, U u) where R,T and U are of the same type • Returns the function result • Comparator<T> – Compares its two arguments for order. – Functional method is int compareTo(T o1, T o2) • Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.
  • 17. Anatomy of the Stream Pipeline • A Stream is processed through a pipeline of operations • A Stream starts with a source data structure • Intermediate methods are performed on the Stream elements. These methods produce Streams and are not processed until the terminal method is called. • The Stream is considered consumed when a terminal operation is invoked. No other operation can be performed on the Stream elements afterwards • A Stream pipeline contains some short-circuit methods (which could be intermediate or terminal methods) that cause the earlier intermediate methods to be processed only until the short-circuit method can be evaluated.
  • 18. Anatomy of the Stream Pipeline • Intermediate Methods map, filter, distinct, sorted, peek, limit, parallel • Terminal Methods forEach, toArray, reduce, collect, min, max, count, anyMatch, allMatch, noneMatch, findFirst, findAny, iterator • Short-circuit Methods anyMatch, allMatch, noneMatch, findFirst, findAny,limit
  • 19. Optional<T> Class • A container which may or may not contain a non-null value • Common methods – isPresent() – returns true if value is present – Get() – returns value if present – orElse(T other) – returns value if present, or other – ifPresent(Consumer) – runs the lambda if value is present
  • 20. Common Stream API Methods Used • Void forEach(Consumer) –Easy way to loop over Stream elements –You supply a lambda for forEach and that lambda is called on each element of the Stream –Related peek method does the exact same thing, but returns the original Stream
  • 21. Common Stream API Methods Used • Void forEach(Consumer) –Example Employees.forEach(e -> e.setSalary(e.getSalary() * 11/10)) Give all employees a 10% raise
  • 22. Common Stream API Methods Used • Void forEach(Consumer) –Vs. For Loops List<Employee> employees = getEmployees(); for(Employee e: employees) { e.setSalary(e.getSalary() * 11/10); } –Advantages of forEach • Designed for lambdas to be marginally more succinct • Lambdas are reusable • Can be made parallel with minimal effort
  • 23. Common Stream API Methods Used • Stream<T> map(Function) –Produces a new Stream that is the result of applying a Function to each element of original Stream –Example Ids.map(EmployeeUtils::findEmployeeById) Create a new Stream of Employee ids
  • 24. Common Stream API Methods Used • Stream<T> filter(Predicate) –Produces a new Stream that contains only the elements of the original Stream that pass a given test –Example employees.filter(e -> e.getSalary() > 100000) Produce a Stream of Employees with a high salary
  • 25. Common Stream API Methods Used • Optional<T> findFirst() –Returns an Optional for the first entry in the Stream –Example employees.filter(…).findFirst().orElse(Consul tant) Get the first Employee entry that passes the filter
  • 26. Common Stream API Methods Used • Object[] toArray(Supplier) –Reads the Stream of elements into a an array –Example Employee[] empArray = employees.toArray(Employee[]::new); Create an array of Employees out of the Stream of Employees
  • 27. Common Stream API Methods Used • List<T> collect(Collectors.toList()) • Reads the Stream of elements into a List or any other collection – Example List<Employee> empList = employees.collect(Collectors.toList()); Create a List of Employees out of the Stream of Employees
  • 28. Common Stream API Methods Used • List<T> collect(Collectors.toList()) – partitioningBy • You provide a Predicate. It builds a Map where true maps to a List of entries that passed the Predicate, and false maps to a List that failed the Predicate. • Example Map<Boolean,List<Employee>> richTable = googlers().collect (partitioningBy(e -> e.getSalary() > 1000000)); – groupingBy • You provide a Function. It builds a Map where each output value of the Function maps to a List of entries that gave that value. • Example Map<Department,List<Employee>> deptTable = employeeStream().collect(groupingBy(Employee::getDepartment));
  • 29. Common Stream API Methods Used • T reduce(T identity, BinaryOperator) • You start with a seed (identity) value, then combine this value with the first Entry in the Stream, combine the second entry of the Stream, etc. – Example Nums.stream().reduce(1, (n1,n2) -> n1*n2) Calculate the product of numbers • IntStream (Stream on primative int] has build-in sum() • Built-in Min, Max methods
  • 30. Common Stream API Methods Used • Stream<T> limit(long maxSize) • Limit(n) returns a stream of the first n elements –Example someLongStream.limit(10) First 10 elements
  • 31. Common Stream API Methods Used •Stream<T> skip(long n) • skip(n) returns a stream starting with element n –Example twentyElementStream.skip(5) Last 15 elements
  • 32. Common Stream API Methods Used • Stream<T> sorted(Comparator) – Returns a stream consisting of the elements of this stream, sorted according to the provided Comparator – Example empStream.map(…).filter(…).limit(…) .sorted((e1, e2) -> e1.getSalary() - e2.getSalary()) Employees sorted by salary
  • 33. Common Stream API Methods Used • Optional<T> min(Comparator) – Returns the minimum element in this Stream according to the Comparator – Example Employee alphabeticallyFirst = ids.stream().map(EmployeeSamples::findGoogler) .min((e1, e2) -> e1.getLastName() .compareTo(e2.getLastName())) .get(); Get Googler with earliest lastName
  • 34. Common Stream API Methods Used • Optional<T> max(Comparator) – Returns the minimum element in this Stream according to the Comparator – Example Employee richest = ids.stream().map(EmployeeSamples::findGoogler) .max((e1, e2) -> e1.getSalary() - e2.getSalary()) .get(); Get Richest Employee
  • 35. Common Stream API Methods Used • Stream<T> distinct() – Returns a stream consisting of the distinct elements of this stream – Example List<Integer> ids2 = Arrays.asList(9, 10, 9, 10, 9, 10); List<Employee> emps4 = ids2.stream().map(EmployeeSamples::findGoogler) .distinct() .collect(toList()); Get a list of distinct Employees
  • 36. Common Stream API Methods Used • Boolean anyMatch(Predicate), allMatch(Predicate), noneMatch(Predicate) – Returns true if Stream passes, false otherwise – Lazy Evaluation • anyMatch processes elements in the Stream one element at a time until it finds a match according to the Predicate and returns true if it found a match • allMatch processes elements in the Stream one element at a time until it fails a match according to the Predicate and returns false if an element failed the Predicate • noneMatch processes elements in the Stream one element at a time until it finds a match according to the Predicate and returns false if an element matches the Predicate – Example employeeStream.anyMatch(e -> e.getSalary() > 500000) Is there a rich Employee among all Employees?
  • 37. Common Stream API Methods Used • long count() – Returns the count of elements in the Stream – Example employeeStream.filter(somePredicate).c ount() How many Employees match the criteria?
  • 38. Parallel Streams • Helper Methods For Timing private static void timingTest(Stream<Employee> testStream) { long startTime = System.nanoTime(); testStream.forEach(e -> doSlowOp()); long endTime = System.nanoTime(); System.out.printf(" %.3f seconds.%n", deltaSeconds(startTime, endTime)); } private static double deltaSeconds(long startTime, long endTime) { return((endTime - startTime) / 1000000000); }
  • 39. Parallel Streams • Helper Method For Simulating Long Operation void doSlowOp() { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException ie) { // Nothing to do here. } }
  • 40. Parallel Streams • Main Code System.out.print("Serial version [11 entries]:"); timingTest(googlers()); int numProcessorsOrCores = Runtime.getRuntime().availableProcessors(); System.out.printf("Parallel version on %s-core machine:", numProcessorsOrCores); timingTest(googlers().parallel() );
  • 41. Parallel Streams •Results Serial version [11 entries]: 11.000 seconds. Parallel version on 4-core machine: 3.000 seconds.
  • 42. (On The Fly) Streams • Stream<T> generate(Supplier) – The method lets you specify a Supplier – This Supplier is invoked each time the system needs a Stream element – Example List<Employee> emps = Stream.generate(() -> randomEmployee()) .limit(n) .collect(toList()); • Stream<T> iterate(T seed, UnaryOperator<T> f) – The method lets you specify a seed and a UnaryOperator. – The seed becomes the first element of the Stream, f(seed) becomes the second element of the Stream, f(second) becomes the third element, etc. – Example List<Integer> powersOfTwo = Stream.iterate(1, n -> n * 2) .limit(n) .collect(toList()); • The values are not calculated until they are needed • To avoid unterminated processing, you must eventually use a size-limiting method • This is less of an actual Unbounded Stream and more of an “On The Fly” Stream
  • 43. References • Stream API – http://download.java.net/jdk8/docs/api/java/util/stream/S tream.html • Java 8 Explained: Applying Lambdas to Java Collections – http://zeroturnaround.com/rebellabs/java-8-explained- applying-lambdas-to-java-collections/ • Java 8 first steps with Lambdas and Streams – https://blog.codecentric.de/en/2013/10/java-8-first-steps- lambdas-streams/ • Java 8Tutorial: Lambda Expressions, Streams, and More – http://www.coreservlets.com/java-8-tutorial/