lambdas in java 8 - meetupfiles.meetup.com/1956831/jozi-jug.lambdas.pdf · •lambdas were...
TRANSCRIPT
![Page 1: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/1.jpg)
Lambdas in Java 8Start programming in a more functional style
![Page 2: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/2.jpg)
Background
Who am I?• Tobias Coetzee
• I’m a Technical Lead at BBD
• I present the Java Expert Level Certifications at BBD (EJB,
JPA, etc.)
• I’m currently a banker
• Part of the JoziJug organising committee
• I like to run
• This presentation is based on a Simon Ritter course
• @tobiascode
• https://github.com/Jozi-JUG/lamdatraining
![Page 3: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/3.jpg)
ASK QUESTIONS, SWAG FOR EVERYONE!!
![Page 4: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/4.jpg)
Outcomes
What are the take away’s?• Why should we care about lambdas
• Apply lambdas to everyday problems
• Determine when to apply lambdas (and when not to!)
• How does the lambda syntax work?
• What are functional interfaces?
• Convert anonymous classes to lambda expressions
• Debug lambda expressions
![Page 5: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/5.jpg)
Why Lambdas?
![Page 6: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/6.jpg)
Why lambdas?
Why care about concurrency in Java?• CPU’s are getting much faster, but we are getting more cores to use.
• We need to parallelise our processing.
• The functional programming paradigm lends itself better to parallel
processing as there is no external state.
Concurrency history in Java• Java 1 had threads.
• Java 5 had java.util.concurrent (BlockingQueue, Executers, etc.).
• Java 7 had Fork/Join framework.
• Java 8 gives us Lambdas.
![Page 7: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/7.jpg)
Demo: Intro to functional programming in Java 8
![Page 8: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/8.jpg)
When do we use lambdas?
Usages• Inject functionality into methods, the same way we inject
values into methods.
• Look where methods are very similar except for 1 or 2 lines of
code.
• Look at streams for clues, filtering, mapping, finding,
matching, etc.
• Enhance library methods, look at new Collection methods.
• Small one line functions.
• To shorten your code, remove inner classes and anonymous
classes.
• If you want to use streams.
![Page 9: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/9.jpg)
When don’t we use lambdas?
Non-Usages• Lambdas were introduced into Java for 2 reasons, to
allow programming in a functional paradigm and to
make code shorter and more concise.
• If it isn’t used for one or both these reasons, rethink the
usage.
• Avoid huge lambdas, e.g. 20 lines of code.
• Because it is cool!
![Page 10: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/10.jpg)
Lambda Syntax
![Page 11: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/11.jpg)
Lambda Syntax
Basic Structure(parameters) -> {lambda body}
Rules• Lambdas can be single or multi-line
• Single line Lambdas
• Do not need curly braces
• Do not need an explicit return statement
• Lambdas with a single parameter do not need braces
• Lambdas with no parameters must have empty braces
• Body of the Lambda may throw exceptions
lambda operator
![Page 12: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/12.jpg)
Lambda Syntax
Examples• () -> System.out.println("Hello Lambda")
• x -> x + 10
• (int x, int y) -> { return x + y; }
• (String x, String y) -> x.length() – y.length()
• (String x) -> {
listA.add(x);
listB.remove(x);
return listB.size();
}
• (x, y) -> x.length() – y.length()
![Page 13: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/13.jpg)
Exercise: Lambda Functions
![Page 14: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/14.jpg)
Functional Interfaces
![Page 15: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/15.jpg)
Functional Interfaces
Lambda Expression Types• A lambda expression is an anonymous function, it is not
associated with a class.
• A lambda expression can be used wherever the type is a
functional interface.
• This is a single abstract method type.
• The lambda expression provides the implementation
of the abstract method.
![Page 16: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/16.jpg)
Functional Interfaces
Definition• An interface that has only one abstract method.
• Before Java 8 this was obvious, only one method.
• Java 8 introduced default methods
• Multiple inheritance of behaviour for Java
• Java 8 also now allows static methods in interfaces
• @FunctionalInterface annotation
• Previously known as SAM’s, Single Abstract Methods
• java.lang.Runnable, java.awt.event.ActionListener,
java.util.Comparator, java.util.concurrent.Callable
![Page 17: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/17.jpg)
True or False: Functional Interfaces
![Page 18: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/18.jpg)
Functional Interfaces
Example Uses Of Lambda Expressions• Method parameterconsumeStudent(s ->
System.out.println(s.getGrade()));
• Variable assignmentConsumer<Student> c = s ->
System.out.println(s.getGrade())
![Page 19: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/19.jpg)
Functional Interfaces
java.util.function Package• Well defined set of general purpose functional interfaces.
• All have only one abstract method.
• Lambda expressions can be used wherever these types
are referenced.
• Used extensively in the Java class libraries.
• Especially with the Stream API.
• Includes several static methods to help with
composing/chaining.
• Variations on number of arguments and specific for
primitive types.
![Page 20: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/20.jpg)
Functional Interfaces
Supplied InterfacesInterface Description
Consumer<T> Operation that takes a single value and returns no result.
Supplier A supplier of results.
Function<T,R> A function that accepts one argument and returns a
result.
UnaryOperator<T> Specialised form of function, takes a single argument and
returns a result of the same type.
BinaryOperator<T> Specialised form of function, takes two arguments and
returns a result of the same type
Predicate A boolean valued function that takes one argument.
![Page 21: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/21.jpg)
Demo: General Functional Interfaces
![Page 22: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/22.jpg)
Method and Constructor References
![Page 23: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/23.jpg)
Method&Constructor References
Usage• Method references let us reuse a method as a lambda
expression.FileFilter x = File f -> f.canRead();
FileFilter x = File::canRead;
• Format: target_reference::method_name
• Three kinds of method reference
• Static method
• Instance method of an arbitrary type
• Instance method of an existing object
![Page 24: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/24.jpg)
Method&Constructor References
Rules For Construction(args) -> ClassName.staticMethod(args)
ClassName::staticMethod
(arg0, rest) -> arg0.instanceMethod(rest)
ClassName::instanceMethod
(args) -> expr.instanceMethod(args)
expr::instanceMethod
![Page 25: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/25.jpg)
Method&Constructor References
Constructor Reference• Same concept as a method reference.
Factory<List<String>> f = () -> return
new ArrayList<String>();
Factory<List<String>> f =
ArrayList<String>::new;
![Page 26: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/26.jpg)
Referencing External Variables
![Page 27: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/27.jpg)
Referencing External Variables
Effectively Final• Lambda expressions can refer to effectively final local
variables from the surrounding scope.
class DataProcessor {
private int currentValue;
public void process() {
DataSet myData = myFactory.getDataSet();
dataSet.forEach(d -> d.use(currentValue++));
}
}
![Page 28: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/28.jpg)
Referencing External Variables
Effectively Final• Effectively final: A variable that meets the requirements
for final variables (i.e., assigned once), even if not
explicitly declared final.
• Closures on values, not variables.
• Closures allow you to use variables defined outside the
scope of a function.
• For heap-based objects, e.g. arrays, modify values just
not reference.
![Page 29: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/29.jpg)
Referencing External Variables
‘this’ in a Lambda• 'this' refers to the enclosing object, not the lambda itself.
• Remember the Lambda is an anonymous function.
• It is not associated with a class, therefore there can be no 'this' for a
lambda.
class DataProcessor {
private int currentValue;
public void process() {
DataSet myData = myFactory.getDataSet();
dataSet.forEach(d -> d.use(this.currentValue++));
}
}
![Page 30: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/30.jpg)
Debugging Lambda Methods
![Page 31: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/31.jpg)
Debugging Lambdas
Problem• Lambda expressions do not compile to
equivalent inner class.
• Compiled to invokedynamic call.
• Implementation decided at runtime.
• Better chance of optimisation, makes debugging
harder.
![Page 32: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/32.jpg)
Debugging Lambdas
Solution• IDE should support debugging.
• If not, extract the code from a lambda expression
into a separate method.
• Replace the lambda with a method reference for
the new method.
• Implement the functional interface and pass a
reference of the class.
![Page 33: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/33.jpg)
Demo: Debugging a lambda function
![Page 34: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/34.jpg)
New Lambda Methods in Java 8
![Page 35: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/35.jpg)
New Lambda Methods
Why New Methods?• Look at existing interfaces for new default or static
methods, they are normally the new methods that accept
lambdas.
• Use the new methods in Java 8 to eliminate the frequent
need for loops.
• Fits in with using the functional paradigm.
• Remember that a lambda provides behaviour, not a
value.
• Very useful for conditional uses of data.
![Page 36: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/36.jpg)
Functional Interfaces
Some examplesInterface Description
Iterable.forEach(Consumer c) myList.forEach(System.out::println);
Collection.removeIf(Predicate p) myList.removeIf(s -> s.length() == 0);
List.replaceAll(UnaryOperator o) myList.replaceAll(String::toUpperCase);
List.sort(Comparator c)
Replaces Collections.sort(List l, Comparator c)
myList.sort((x, y) -> x.length() –
y.length());
![Page 37: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/37.jpg)
Exercises
![Page 38: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/38.jpg)
Exercises
How does it work?• The exercises for this month are all small exercises that you will complete
using the things you have learned during this presentation.
• There are 6 exercises to complete.
• For first month focus on using lambda expressions, method references and
some of the new methods that have been added to existing classes.
• There is a template source file that you should use to create the answers to
the exercises called Exercise_Test.java under the test folder.
• To simplify things the lists and maps you need for the exercises have already
been created.
• You just need to focus on the code to solve the exercise.
• The solutions are in the Solution_Test.java file, but try all the exercises first
before taking a peak.
![Page 39: Lambdas in Java 8 - Meetupfiles.meetup.com/1956831/Jozi-JUG.Lambdas.pdf · •Lambdas were introduced into Java for 2 reasons, to allow programming in a functional paradigm and to](https://reader034.vdocuments.us/reader034/viewer/2022050115/5f4c7832c3b540725420bb96/html5/thumbnails/39.jpg)
Thank you!