java 8 lambda expressionsschmidt/cs891f/2019-pdfs/func-prog-pt3.pdf · programming features in java...
TRANSCRIPT
![Page 1: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/1.jpg)
Java 8 Lambda Expressions
Douglas C. Schmidt
![Page 2: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/2.jpg)
Learning Objectives in This Lesson• Recognize foundational functional
programming features in Java 8, e.g.,
• Lambda expressions
Several concise examples are used to showcase foundational Java 8 features.
![Page 3: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/3.jpg)
Overview of Java 8 Lambda Expressions
Douglas C. Schmidt
![Page 4: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/4.jpg)
• A lambda expression is an unnamed block of code (with optional parameters) that can be stored, passed around, & executed later
new Thread(() -> System.out.println("hello world"))
.start();
See www.drdobbs.com/jvm/lambda-expressions-in-java-8/240166764
Overview of Java 8 Lambda Expressions
![Page 5: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/5.jpg)
• A lambda expression is an unnamed block of code (with optional parameters) that can be stored, passed around, & executed later
new Thread(() -> System.out.println("hello world"))
.start();
See docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html
Overview of Java 8 Lambda Expressions
The Thread constructor expects an instance of Runnable.
![Page 6: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/6.jpg)
• A lambda expression is an unnamed block of code (with optional parameters) that can be stored, passed around, & executed later, e.g.,
new Thread(() -> System.out.println("hello world"))
.start();
This lambda expression takes no parameters, i.e., “()”.
Overview of Java 8 Lambda Expressions
![Page 7: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/7.jpg)
• A lambda expression is an unnamed block of code (with optional parameters) that can be stored, passed around, & executed later, e.g.,
new Thread(() -> System.out.println("hello world"))
.start();
Overview of Java 8 Lambda Expressions
The arrow separates the param list from the body of the lambda.
![Page 8: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/8.jpg)
• A lambda expression is an unnamed block of code (with optional parameters) that can be stored, passed around, & executed later, e.g.,
new Thread(() -> System.out.println("hello world"))
.start();
Overview of Java 8 Lambda Expressions
The body of the lambda defines the computation.
![Page 9: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/9.jpg)
• A lambda expression is an unnamed block of code (with optional parameters) that can be stored, passed around, & executed later, e.g.,
new Thread(() -> System.out.println("hello world"))
.start();
Java 8 lambda expressions support more concise types of “behavioral parameterization.”
Overview of Java 8 Lambda Expressions
See blog.indrek.io/articles/java-8-behavior-parameterization
![Page 10: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/10.jpg)
• A lambda expression is an unnamed block of code (with optional parameters) that can be stored, passed around, & executed later, e.g.,
new Thread(() -> System.out.println("hello world"))
.start();
Runtimethread stack
See docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html
Overview of Java 8 Lambda Expressions
This lambda defines a computation that runs in a separate Java thread.
![Page 11: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/11.jpg)
• A lambda expression is an unnamed block of code (with optional parameters) that can be stored, passed around, & executed later, e.g.,
new Thread(() -> System.out.println("hello world"))
.start();
Runnable r = () -> System.out.println("hello world");
new Thread(r).start();
See docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html
You can also store a lambda expression into a variable & pass that variable to a method.
Overview of Java 8 Lambda Expressions
![Page 12: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/12.jpg)
• A lambda expression is an unnamed block of code (with optional parameters) that can be stored, passed around, & executed later, e.g.,
new Thread(() -> System.out.println("hello world"))
.start();
Lambda expressions are compact since they just focus on computation(s) to perform.
Overview of Java 8 Lambda Expressions
![Page 13: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/13.jpg)
• A lambda expression is an unnamed block of code (with optional parameters) that can be stored, passed around, & executed later, e.g.,
new Thread(() -> System.out.println("hello world"))
.start();
vs.
new Thread(new Runnable() {
public void run() {
System.out.println("hello world");
}}).start();
Conversely, this anonymous inner class requires more code to write each time.
Overview of Java 8 Lambda Expressions
![Page 14: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/14.jpg)
See github.com/douglascraigschmidt/LiveLessons/tree/master/Java8/ex1
• Lambda expressions can work with multiple parameters in a much more compact manner than anonymous inner classes
String[] nameArray = {"Barbara", "James", "Mary", "John",
"Robert", "Michael", "Linda", "james", "mary"};
Arrays.sort(nameArray, new Comparator<String>(){
public int compare(String s,String t) { return
s.toLowerCase().compareTo(t.toLowerCase()); }});
vs.
Arrays.sort(nameArray,
(s, t) -> s.compareToIgnoreCase(t));
Overview of Java 8 Lambda Expressions
![Page 15: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/15.jpg)
• Lambda expressions can work with multiple parameters in a much more compact manner than anonymous inner classes, e.g.,
String[] nameArray = {"Barbara", "James", "Mary", "John",
"Robert", "Michael", "Linda", "james", "mary"};
Arrays.sort(nameArray, new Comparator<String>(){
public int compare(String s,String t) { return
s.toLowerCase().compareTo(t.toLowerCase()); }});
vs.
Arrays.sort(nameArray,
(s, t) -> s.compareToIgnoreCase(t));
Array of names represented as strings.
Overview of Java 8 Lambda Expressions
![Page 16: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/16.jpg)
• Lambda expressions can work with multiple parameters in a much more compact manner than anonymous inner classes, e.g.,
String[] nameArray = {"Barbara", "James", "Mary", "John",
"Robert", "Michael", "Linda", "james", "mary"};
Arrays.sort(nameArray, new Comparator<String>(){
public int compare(String s,String t) { return
s.toLowerCase().compareTo(t.toLowerCase()); }});
Extraneous syntax for anonymous inner class.
Overview of Java 8 Lambda Expressions
![Page 17: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/17.jpg)
• Lambda expressions can work with multiple parameters in a much more compact manner than anonymous inner classes, e.g.,
String[] nameArray = {"Barbara", "James", "Mary", "John",
"Robert", "Michael", "Linda", "james", "mary"};
Arrays.sort(nameArray, new Comparator<String>(){
public int compare(String s,String t) { return
s.toLowerCase().compareTo(t.toLowerCase()); }});
vs.
Arrays.sort(nameArray,
(s, t) -> s.compareToIgnoreCase(t));
(s, t) is short for (String s, String t), which leverages Java 8’s type inference capabilities.
See docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html
Overview of Java 8 Lambda Expressions
![Page 18: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/18.jpg)
• Lambda expressions can work with multiple parameters in a much more compact manner than anonymous inner classes, e.g.,
String[] nameArray = {"Barbara", "James", "Mary", "John",
"Robert", "Michael", "Linda", "james", "mary"};
Arrays.sort(nameArray, new Comparator<String>(){
public int compare(String s,String t) { return
s.toLowerCase().compareTo(t.toLowerCase()); }});
vs.
Arrays.sort(nameArray,
(s, t) -> s.compareToIgnoreCase(t));
This lambda expression omits the method name & extraneous syntax.
Overview of Java 8 Lambda Expressions
![Page 19: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/19.jpg)
• Lambda expressions can work with multiple parameters in a much more compact manner than anonymous inner classes, e.g.,
String[] nameArray = {"Barbara", "James", "Mary", "John",
"Robert", "Michael", "Linda", "james", "mary"};
Arrays.sort(nameArray, new Comparator<String>(){
public int compare(String s,String t) { return
s.toLowerCase().compareTo(t.toLowerCase()); }});
vs.
Arrays.sort(nameArray,
(s, t) -> s.compareToIgnoreCase(t));
Overview of Java 8 Lambda Expressions
Therefore, it’s good practice to use lambda expressions whenever you can!
✓
![Page 20: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/20.jpg)
• A lambda expression can access the (effectively) final variables from the enclosing scope.
int answer = 42;
new Thread(() -> System.out.println("The answer is " + answer))
.start();
Overview of Java 8 Lambda Expressions
This lambda expression can access the value of “answer,” which is an effectively final variable whose value never changes after it’s initialized.
See www.linkedin.com/pulse/java-8-effective-final-gaurhari-dass
![Page 21: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/21.jpg)
See henrikeichenhardt.blogspot.com/2013/06/why-shared-mutable-state-is-root-of-all.html
• Lambda expressions are most effective when they are “stateless” & have no shared mutable data.
int answer = 42;
new Thread(() -> System.out.println("The answer is " + answer))
.start();
Overview of Java 8 Lambda Expressions
Shared MutableData
![Page 22: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/22.jpg)
See docs.oracle.com/javase/tutorial/collections/streams/parallelism.html
• Lambda expressions are most effective when they are “stateless” & have no shared mutable data.
Overview of Java 8 Lambda Expressions
Stateless lambda expressions are particularly useful when
applied to Java parallel streams.
![Page 23: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/23.jpg)
Implementing Closures With Java 8 Lambda Expressions
Douglas C. Schmidt
![Page 24: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/24.jpg)
See github.com/douglascraigschmidt/LiveLessons/tree/master/Java8/ex1
• Lambda expressions can implement (simplified) variants of “closures”
class ClosureExample {
private int mRes;
Thread makeThreadClosure(String s, int n) {
return new Thread(()-> System.out.println(s + (mRes += n)));
}
ClosureExample() throw InterruptedException {
Thread t = makeThreadClosure("result = ", 10);
t.start(); t.join();
}
}
Implementing Closures with Java 8 Lambda Expressions
![Page 25: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/25.jpg)
• Lambda expressions can implement (simplified) variants of “closures”
class ClosureExample {
private int mRes;
Thread makeThreadClosure(String s, int n) {
return new Thread(()-> System.out.println(s + (mRes += n)));
}
ClosureExample() throw InterruptedException {
Thread t = makeThreadClosure("result = ", 10);
t.start(); t.join();
}
}
Implementing Closures with Java 8 Lambda Expressions
A closure is an object storing a method together w/ an environment that has least one bound variable.
See en.wikipedia.org/wiki/Closure_(computer_programming)
![Page 26: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/26.jpg)
• Lambda expressions can implement (simplified) variants of “closures”
class ClosureExample {
private int mRes;
Thread makeThreadClosure(String s, int n) {
return new Thread(()-> System.out.println(s + (mRes += n)));
}
ClosureExample() throw InterruptedException {
Thread t = makeThreadClosure("result = ", 10);
t.start(); t.join();
}
}
Implementing Closures with Java 8 Lambda Expressions
This private field & the method params are “bound variables.”
A bound variable is name that has a value, such as a number or a string.
![Page 27: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/27.jpg)
• Lambda expressions can implement (simplified) variants of “closures”
class ClosureExample {
private int mRes;
Thread makeThreadClosure(String s, int n) {
return new Thread(()-> System.out.println(s + (mRes += n)));
}
ClosureExample() throw InterruptedException {
Thread t = makeThreadClosure("result = ", 10);
t.start(); t.join();
}
}
Implementing Closures with Java 8 Lambda Expressions
This lambda implements a closure that captures a private field & method params.
See bruceeckel.github.io/2015/10/17/are-java-8-lambdas-closures
![Page 28: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/28.jpg)
• Lambda expressions can implement (simplified) variants of “closures”
class ClosureExample {
private int mRes;
Thread makeThreadClosure(String s, int n) {
return new Thread(()-> System.out.println(s + (mRes += n)));
}
ClosureExample() throw InterruptedException {
Thread t = makeThreadClosure("result = ", 10);
t.start(); t.join();
}
}
Implementing Closures with Java 8 Lambda Expressions
Values of private fields can be updated in a lambda, but not params or local vars (which are read-only).
See dzone.com/articles/java-8-lambas-limitations-closures
![Page 29: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/29.jpg)
• Lambda expressions can implement (simplified) variants of “closures”
class ClosureExample {
private int mRes;
Thread makeThreadClosure(String s, int n) {
return new Thread(()-> System.out.println(s + (mRes += n)));
}
ClosureExample() throw InterruptedException {
Thread t = makeThreadClosure("result = ", 10);
t.start(); t.join();
}
}
Implementing Closures with Java 8 Lambda Expressions
This factory method creates a closure that then runs in a background thread.
See en.wikipedia.org/wiki/Factory_method_pattern
![Page 30: Java 8 Lambda Expressionsschmidt/cs891f/2019-PDFs/func-prog-pt3.pdf · programming features in Java 8, e.g., •Lambda expressions Several concise examples are used to showcase foundational](https://reader033.vdocuments.net/reader033/viewer/2022042810/5f98a497a8a61b59725cec85/html5/thumbnails/30.jpg)