SlideShare a Scribd company logo
1 of 73
Download to read offline
@mirocupak
Miro Cupak
VP Engineering, DNAstack
18/11/2018
Master class in Java
in 2018
@mirocupak
Lessons
!2
• Lesson 1: JShell.
• Lesson 2: Convenience factory methods for collections.
• Lesson 3: Improved try-with-resources.
• Lesson 4: Stream API enhancements.
• Lesson 5: Extensions to Optional.
• Lesson 6: CompletableFuture updates.
• Lesson 7: Reactive streams.
• Lesson 8: Process API.
• Lesson 9: HTTP/2 client.
• Lesson 10: Local variable type inference.
@mirocupak
Organization
!3
• 10 independent lessons
• lesson structure:
• theory
• demo
• exercises
• solutions
• best practices
• (optional) reading
• environment: JShell
@mirocupak
Setup
!4
• Prerequisites:
• JDK 11: https://jdk.java.net/11/
• Familiarity with Java 8.
• These slides.
Task 0.1
Verify you have JDK 11 with java -version.
@mirocupak !5
JShell
Lesson 1
@mirocupak
Lesson 1: JShell
!6
Task 1.1
Start and exit JShell.
@mirocupak
Lesson 1: JShell
!7
Task 1.2
Create a variable containing a string. Redefine the variable to contain an
integer.
@mirocupak
Lesson 1: JShell
!8
Task 1.3
Call a method that might throw a (checked) exception. How is it handled?
What happens when an exception is thrown? How is a location in JShell
referenced in a stacktrace?
@mirocupak
Lesson 1: JShell
!9
Task 1.4
Create a simple method and call it. Create a class containing a method
and call it.
@mirocupak
Lesson 1: JShell
!10
Task 1.5
Modify your method to call another method that you haven’t implemented
yet. What happens?
@mirocupak
Lesson 1: JShell
!11
Task 1.6
Show the current time.
@mirocupak
Lesson 1: JShell
!12
Task 1.7
Find what keyboard shortcuts JShell supports. Try them out. How do you
view Javadoc?
@mirocupak
Lesson 1: JShell
!13
Task 1.8
What are the possible arguments for the /list and /edit commands?
@mirocupak
Lesson 1: JShell
!14
Task 1.9
Save your current snippets, restart JShell, and load the snippets you
saved. Save all the commands and snippets for later use.
@mirocupak
Lesson 1: JShell
!15
Task 1.10
Explore the /env command. Load an external library and use it from
JShell. Unload it when done.
@mirocupak
Lesson 1: JShell
!16
Task 1.11
Set the feedback mode and editor to whatever you’re comfortable with.
@mirocupak
Lesson 1: JShell
!17
Task 1.12
Use JShell to explore its own API. Use the API to process a snippet of
your choice and read the results.
@mirocupak
Lesson 1: JShell
!18
• Useful tool for whenever you need to try out something small quickly.
• Not a debugging tool.
• Prefer IDEs for any larger tasks.
• Use /help for more information about commands.
• Configure your own editor.
• More info: JEP 222: jshell: The Java Shell (Read-Eval-Print Loop).
@mirocupak !19
Convenience factory
methods for collections
Lesson 2
@mirocupak
Lesson 2: Convenience factory
methods for collections
!20
Task 2.1
How would you create an immutable set in Java 8? What are the
problems with this approach? Are there any alternatives?
@mirocupak
Lesson 2: Convenience factory
methods for collections
!21
Task 2.2
What is the type of the return value of the of method?
@mirocupak
Lesson 2: Convenience factory
methods for collections
!22
Task 2.3
What’s the API for creating immutable collections for Set and Map? Does
it differ from List?
@mirocupak
Lesson 2: Convenience factory
methods for collections
!23
Task 2.4
What’s the API for creating immutable copies of collections for a Map?
How does it differ from the respective API in List and Set?
@mirocupak
Lesson 2: Convenience factory
methods for collections
!24
Task 2.5
How do you get the output of a stream into an immutable collection?
@mirocupak !25
• Obtain immutable collections via of/ofEntries methods.
• Create immutable copies of collections via copyOf (Java 10).
• Static import java.util.Map.entry.
• Less verbose, no static initializer blocks.
• Don’t use Arrays.asList or Stream.of as shortcuts for creating
collections.
• Don’t use external libraries if you only need immutable collections
(Guava).
• No need to worry about leaving references to underlying collections.
• Thread-safe and can be shared freely (no need for defensive copies).
Lesson 2: Convenience factory
methods for collections
@mirocupak !26
• Good performance.
• Don’t create mutable collections unless necessary.
• More info: JEP 269: Convenience Factory Methods for Collections.
Lesson 2: Convenience factory
methods for collections
@mirocupak !27
Improved try-with-resources
Lesson 3
@mirocupak
Lesson 3: Improved try-with-
resources
!28
Task 3.1
Read a file from disk to standard output (copy to standard output). Make
sure you clean up the resources as needed.
@mirocupak
Lesson 3: Improved try-with-
resources
!29
Task 3.2
Refactor your previous example to take advantage of effectively final
variables.
@mirocupak
Lesson 3: Improved try-with-
resources
!30
Task 3.3
Can we make the code even simpler?
Hint: Check out the InputStream API for useful methods.
@mirocupak !31
• Always prefer try-with-resources, don’t use try-finally and definitely
don’t use finalizers to close resources.
• Be aware of convenience methods, such as
InputStream.transferTo.
• Don’t create unnecessary helper objects.
• More info: JEP 213: Milling Project Coin.
Lesson 3: Improved try-with-
resources
@mirocupak !32
Stream API enhancements
Lesson 4
@mirocupak
Lesson 4: Stream API enhancements
!33
Task 4.1
Modify the stream below to only print the numbers <5 (>5).
IntStream.range(0,10).forEach(System.out::println)
@mirocupak
Lesson 4: Stream API enhancements
!34
Task 4.2
Demonstrate a difference between filter and takeWhile
(dropWhile).
Hint: Print even numbers <100.
@mirocupak
Lesson 4: Stream API enhancements
!35
Task 4.3
Improve the code from the previous task.
@mirocupak
Lesson 4: Stream API enhancements
!36
Task 4.4
Come up with a scenario where ofNullable helps.
@mirocupak
Lesson 4: Stream API enhancements
!37
Task 4.5
Suppose we have the following list of numbers:
List.of(2, 3, 4, 7, 9, 11)
Count the numbers >5 by parity.
Hint: filtering.
@mirocupak
Lesson 4: Stream API enhancements
!38
Task 4.6
Explore how the pattern matching API plays nicely with streams.
Hint: Use Matcher to obtain all results of a match.
@mirocupak
Lesson 4: Stream API enhancements
!39
Task 4.7
Explore how the date-time API plays nicely with streams.
Hint: Use LocalDate to obtain list of dates between now and Christmas.
@mirocupak !40
• Be aware of new stream methods: takeWhile, dropWhile,
iterate.
• Familiarize yourself with various collectors available out of the box.
• Prefer collecting into immutable collections using
toUnmodifiableList, toUnmodifiableSet,
toUnmodifiableMap.
• Check for convenience stream methods before converting to streams
manually (e.g. LocalDate, Matcher).
• Avoid unnecessary null checks with ofNullable.
• Streams are suitable for more use cases now, but not all use cases.
• Don’t overuse streams as they can make code hard to read and
difficult to maintain.
Lesson 4: Stream API enhancements
@mirocupak !41
Extensions to Optional
Lesson 5
@mirocupak
Lesson 5: Extensions to Optional
!42
Task 5.1
Given an Optional, print its value if the value is present, otherwise print
“empty”.
@mirocupak
Lesson 5: Extensions to Optional
!43
Task 5.2
What other methods in the Optional API are similar to or?
@mirocupak
Lesson 5: Extensions to Optional
!44
Task 5.3
Another 2 methods in the same family were added in Java 10. Can you
find them?
@mirocupak
Lesson 5: Extensions to Optional
!45
Task 5.4
Filter out empty values from a given collection of Optionals, e.g.:
List.of(Optional.of(1), Optional.empty(),
Optional.of(2))
Hint: flatMap.
@mirocupak !46
• Use ifPresentOrElse instead of if-isPresent construct.
• or provides a clean fluent way of chaining behaviour on Optionals.
• Be aware of orElse* methods, e.g. the new orElseThrow (Java 10).
• Use stream to take advantage of the lazy nature of streams and
handle streams of Optionals.
• Remember that isPresent is rarely the answer.
Lesson 5: Extensions to Optional
@mirocupak !47
CompletableFuture updates
Lesson 6
@mirocupak
Lesson 6: CompletableFuture updates
!48
Task 6.1
completeOnTimeout is great for completing a future normally based on
a timeout. How do I complete a future exceptionally based on a timeout?
@mirocupak
Lesson 6: CompletableFuture updates
!49
Task 6.2
Inspect the contract of the copy method. Demonstrate the one-way
synchronization it provides.
@mirocupak
Lesson 6: CompletableFuture updates
!50
Task 6.3
Take some time to explore other new additions to the
CompletableFuture API we haven’t talked about.
@mirocupak !51
• With Java 9+, you can complete CompletableFutures normally and
exceptionally based on a timeout (completeOnTimeout,
orTimeout).
• copy provides an easy method for building asynchronous APIs.
• It’s usually a good idea to make copies before exposing
CompletableFuture in APIs.
• Be aware of the various utility methods in the CompletableFuture
API.
• More info: JEP 266: More Concurrency Updates.
Lesson 6: CompletableFuture updates
@mirocupak !52
Reactive streams
Lesson 7
@mirocupak
Lesson 7: Reactive streams
!53
Task 7.1
Implement a subscriber echoing messages from the publisher.
Hint: Request new message in onSubscribe and onNext.
@mirocupak
Lesson 7: Reactive streams
!54
Task 7.2
What happens if we request 2 messages in onNext every time? How
about Long.MAX_VALUE?
@mirocupak
Lesson 7: Reactive streams
!55
Task 7.3
What happens if we request 0 messages in onNext every time?
@mirocupak
Lesson 7: Reactive streams
!56
Task 7.4
What happens if we subscribe a subscriber twice to a publisher?
@mirocupak
Lesson 7: Reactive streams
!57
Task 7.5
What happens if we subscribe a subscriber to 2 publishers?
@mirocupak
Lesson 7: Reactive streams
!58
Task 7.6
What happens if we submit a message after closing the publisher?
@mirocupak !59
• The right approach for asynchronous stream processing with
nonblocking back pressure.
• Don’t implement yourself, use a library.
• More info: JEP 266: More Concurrency Updates.
Lesson 7: Reactive streams
@mirocupak !60
Process API
Lesson 8
@mirocupak
Lesson 8: Process API
!61
Task 8.1
Launch an external process from Java. What are the problems with this
API?
@mirocupak
Lesson 8: Process API
!62
Task 8.2
List all the commands running in your OS visible to you.
Hint: allProcesses.
@mirocupak
Lesson 8: Process API
!63
Task 8.3
Launch an external process that runs for 3 seconds. Print the PID of the
(now dead) process as soon as it finishes.
Hint: sleep 3.
@mirocupak
Lesson 8: Process API
!64
Task 8.4
List your currently running Java processes with jps. Use grep to find
JShell in the list.
Hint: startPipeline.
@mirocupak !65
• ProcessHandle is a clean way of obtaining information about
processes.
• Don’t implement yourself. Don’t use MXBeans or OS utilities.
• Take advantage of convenience methods: pid, info, command…
• Trigger actions on process termination via onExit.
• Connect ProcessBuilder with ProcessHandle via toHandle.
• Create pipelines via ProcessBuilder.startPipeline.
• More info: JEP 102: Process API Updates.
Lesson 8: Process API
@mirocupak !66
HTTP/2 client
Lesson 9
@mirocupak !67
Task 9.1
Use the new HTTP/2 client API to execute a request against a server.
Read the response.
Lesson 9: HTTP/2 client
@mirocupak !68
Task 9.2
Use the new HTTP/2 client API to execute a request against a server
asynchronously. Read the response.
Lesson 9: HTTP/2 client
@mirocupak
Lesson 9: HTTP/2 client
!69
• Clean separation: HttpClient, HttpRequest, HttpResponse.
• HttpURLConnection is not pleasant to use.
• Avoid APIs with side effects.
• The new client API is versatile, flexible and clean.
• Prefer functionality in the JDK to external libraries.
• But aware it’s an incubator module.
• More info: JEP 110: HTTP 2 Client.
@mirocupak !70
Local variable type
inference
Lesson 10
@mirocupak
Lesson 10: Local variable type inference
!71
• Does not replace static typing.
• Generally good.
• Reduces boilerplate and improves readability.
• Helps with maintenance and refactoring.
• Use for local variables with initializers (especially constructors) and for
loops.
• Can’t use for method formals, constructor formals, method return types,
fields, catch formals, null or array initializers, lambdas, method references,
or any other kind of variable declaration.
• Consider whether to use when the generated type is not obvious.
• But use for complex types when breaking chained or nested expressions
with local variables.
• Primitive types might surprise you, be careful (e.g. byte, short, long all
inferred as int).
@mirocupak !72
• Be very careful about combining with <> and generic methods (e.g. var list
= new ArrayList<>()).
• Probably not the best idea to use with anonymous classes.
• Use carefully chosen and expressive variable names.
• Don’t use Hungarian notation.
• Don’t rely on IDEs.
• Minimize the scope of local variables.
• Declare variable when it’s first used.
• Declaration not containing an initializer (i.e. you can’t use var) often indicates
the scope is not minimal.
• Prefer for loops to while loops.
• Keep methods small and focused.
• Code to the interface pattern does not work, but that’s kind of OK.
• More info: JEP 286: Local-Variable Type Inference.
Lesson 10: Local variable type inference
@mirocupak
Questions?
!73

More Related Content

What's hot

Get ready for FRC 2015: Intro to Java 5 through 8 updates and Eclipse
Get ready for FRC 2015: Intro to Java 5 through 8 updates and EclipseGet ready for FRC 2015: Intro to Java 5 through 8 updates and Eclipse
Get ready for FRC 2015: Intro to Java 5 through 8 updates and EclipseJeanne Boyarsky
 
Azphp phpunit-jenkins
Azphp phpunit-jenkinsAzphp phpunit-jenkins
Azphp phpunit-jenkinsEric Cope
 
Cerberus : Framework for Manual and Automated Testing (Web Application)
Cerberus : Framework for Manual and Automated Testing (Web Application)Cerberus : Framework for Manual and Automated Testing (Web Application)
Cerberus : Framework for Manual and Automated Testing (Web Application)CIVEL Benoit
 
50 EJB 3 Best Practices in 50 Minutes - JavaOne 2014
50 EJB 3 Best Practices in 50 Minutes - JavaOne 201450 EJB 3 Best Practices in 50 Minutes - JavaOne 2014
50 EJB 3 Best Practices in 50 Minutes - JavaOne 2014Ryan Cuprak
 
Java EE 7 meets Java 8
Java EE 7 meets Java 8Java EE 7 meets Java 8
Java EE 7 meets Java 8Roberto Cortez
 
What I Learned From Writing a Test Framework (And Why I May Never Write One A...
What I Learned From Writing a Test Framework (And Why I May Never Write One A...What I Learned From Writing a Test Framework (And Why I May Never Write One A...
What I Learned From Writing a Test Framework (And Why I May Never Write One A...Daryl Walleck
 
Avoid adding a new library to the project
Avoid adding a new library to the projectAvoid adding a new library to the project
Avoid adding a new library to the projectPVS-Studio
 
Erlang - Dive Right In
Erlang - Dive Right InErlang - Dive Right In
Erlang - Dive Right Invorn
 

What's hot (12)

Get ready for FRC 2015: Intro to Java 5 through 8 updates and Eclipse
Get ready for FRC 2015: Intro to Java 5 through 8 updates and EclipseGet ready for FRC 2015: Intro to Java 5 through 8 updates and Eclipse
Get ready for FRC 2015: Intro to Java 5 through 8 updates and Eclipse
 
Maven
MavenMaven
Maven
 
Frc java5-8andeclipse
Frc java5-8andeclipseFrc java5-8andeclipse
Frc java5-8andeclipse
 
Azphp phpunit-jenkins
Azphp phpunit-jenkinsAzphp phpunit-jenkins
Azphp phpunit-jenkins
 
Perl-Critic
Perl-CriticPerl-Critic
Perl-Critic
 
Cerberus : Framework for Manual and Automated Testing (Web Application)
Cerberus : Framework for Manual and Automated Testing (Web Application)Cerberus : Framework for Manual and Automated Testing (Web Application)
Cerberus : Framework for Manual and Automated Testing (Web Application)
 
50 EJB 3 Best Practices in 50 Minutes - JavaOne 2014
50 EJB 3 Best Practices in 50 Minutes - JavaOne 201450 EJB 3 Best Practices in 50 Minutes - JavaOne 2014
50 EJB 3 Best Practices in 50 Minutes - JavaOne 2014
 
Java EE 7 meets Java 8
Java EE 7 meets Java 8Java EE 7 meets Java 8
Java EE 7 meets Java 8
 
Mini training - Reactive Extensions (Rx)
Mini training - Reactive Extensions (Rx)Mini training - Reactive Extensions (Rx)
Mini training - Reactive Extensions (Rx)
 
What I Learned From Writing a Test Framework (And Why I May Never Write One A...
What I Learned From Writing a Test Framework (And Why I May Never Write One A...What I Learned From Writing a Test Framework (And Why I May Never Write One A...
What I Learned From Writing a Test Framework (And Why I May Never Write One A...
 
Avoid adding a new library to the project
Avoid adding a new library to the projectAvoid adding a new library to the project
Avoid adding a new library to the project
 
Erlang - Dive Right In
Erlang - Dive Right InErlang - Dive Right In
Erlang - Dive Right In
 

Similar to Master class in Java in 2018

Working With Concurrency In Java 8
Working With Concurrency In Java 8Working With Concurrency In Java 8
Working With Concurrency In Java 8Heartin Jacob
 
Voxxed Athens 2018 - Clean Code with Java9+
Voxxed Athens 2018 - Clean Code with Java9+Voxxed Athens 2018 - Clean Code with Java9+
Voxxed Athens 2018 - Clean Code with Java9+Voxxed Athens
 
Writing clean code with Java 9+
Writing clean code with Java 9+Writing clean code with Java 9+
Writing clean code with Java 9+Miro Cupak
 
10 clues showing that you are doing OSGi in the wrong manner - Jerome Moliere
10 clues showing that you are doing OSGi in the wrong manner - Jerome Moliere10 clues showing that you are doing OSGi in the wrong manner - Jerome Moliere
10 clues showing that you are doing OSGi in the wrong manner - Jerome Molieremfrancis
 
A Tool for Optimizing Java 8 Stream Software via Automated Refactoring
A Tool for Optimizing Java 8 Stream Software via Automated RefactoringA Tool for Optimizing Java 8 Stream Software via Automated Refactoring
A Tool for Optimizing Java 8 Stream Software via Automated RefactoringRaffi Khatchadourian
 
Aki Salmi - Refactoring legacy code: a true story @ I T.A.K.E. Unconference 2...
Aki Salmi - Refactoring legacy code: a true story @ I T.A.K.E. Unconference 2...Aki Salmi - Refactoring legacy code: a true story @ I T.A.K.E. Unconference 2...
Aki Salmi - Refactoring legacy code: a true story @ I T.A.K.E. Unconference 2...Mozaic Works
 
Ansible top 10 - 2018
Ansible top 10 -  2018Ansible top 10 -  2018
Ansible top 10 - 2018Viresh Doshi
 
How to R.E.A.D: Steps for how to select the correct module @NEWDCamp 2014
How to R.E.A.D: Steps for how to select the correct module @NEWDCamp 2014How to R.E.A.D: Steps for how to select the correct module @NEWDCamp 2014
How to R.E.A.D: Steps for how to select the correct module @NEWDCamp 2014Michael Miles
 
SOA with PHP and Symfony
SOA with PHP and SymfonySOA with PHP and Symfony
SOA with PHP and SymfonyMichalSchroeder
 
Want to write a book in Jupyter - here's how
Want to write a book in Jupyter - here's howWant to write a book in Jupyter - here's how
Want to write a book in Jupyter - here's howJim Arlow
 
The good, the bad, and the ugly of Java API design
The good, the bad, and the ugly of Java API designThe good, the bad, and the ugly of Java API design
The good, the bad, and the ugly of Java API designMiro Cupak
 
The good, the bad, and the ugly of Java API design
The good, the bad, and the ugly of Java API designThe good, the bad, and the ugly of Java API design
The good, the bad, and the ugly of Java API designMiro Cupak
 
SBW 2016: MultiQC Workshop
SBW 2016: MultiQC WorkshopSBW 2016: MultiQC Workshop
SBW 2016: MultiQC WorkshopPhil Ewels
 
The good, the bad, and the ugly of Java API design
The good, the bad, and the ugly of Java API designThe good, the bad, and the ugly of Java API design
The good, the bad, and the ugly of Java API designMiro Cupak
 
Introduction to the intermediate Python - v1.1
Introduction to the intermediate Python - v1.1Introduction to the intermediate Python - v1.1
Introduction to the intermediate Python - v1.1Andrei KUCHARAVY
 
[DevDay 2017] ReactJS Hands on - Speaker: Binh Phan - Developer at mgm techno...
[DevDay 2017] ReactJS Hands on - Speaker: Binh Phan - Developer at mgm techno...[DevDay 2017] ReactJS Hands on - Speaker: Binh Phan - Developer at mgm techno...
[DevDay 2017] ReactJS Hands on - Speaker: Binh Phan - Developer at mgm techno...DevDay.org
 
SciPipe - A light-weight workflow library inspired by flow-based programming
SciPipe - A light-weight workflow library inspired by flow-based programmingSciPipe - A light-weight workflow library inspired by flow-based programming
SciPipe - A light-weight workflow library inspired by flow-based programmingSamuel Lampa
 

Similar to Master class in Java in 2018 (20)

Working With Concurrency In Java 8
Working With Concurrency In Java 8Working With Concurrency In Java 8
Working With Concurrency In Java 8
 
Voxxed Athens 2018 - Clean Code with Java9+
Voxxed Athens 2018 - Clean Code with Java9+Voxxed Athens 2018 - Clean Code with Java9+
Voxxed Athens 2018 - Clean Code with Java9+
 
Writing clean code with Java 9+
Writing clean code with Java 9+Writing clean code with Java 9+
Writing clean code with Java 9+
 
10 clues showing that you are doing OSGi in the wrong manner - Jerome Moliere
10 clues showing that you are doing OSGi in the wrong manner - Jerome Moliere10 clues showing that you are doing OSGi in the wrong manner - Jerome Moliere
10 clues showing that you are doing OSGi in the wrong manner - Jerome Moliere
 
A Tool for Optimizing Java 8 Stream Software via Automated Refactoring
A Tool for Optimizing Java 8 Stream Software via Automated RefactoringA Tool for Optimizing Java 8 Stream Software via Automated Refactoring
A Tool for Optimizing Java 8 Stream Software via Automated Refactoring
 
XPDays-2018
XPDays-2018XPDays-2018
XPDays-2018
 
Aki Salmi - Refactoring legacy code: a true story @ I T.A.K.E. Unconference 2...
Aki Salmi - Refactoring legacy code: a true story @ I T.A.K.E. Unconference 2...Aki Salmi - Refactoring legacy code: a true story @ I T.A.K.E. Unconference 2...
Aki Salmi - Refactoring legacy code: a true story @ I T.A.K.E. Unconference 2...
 
Ansible top 10 - 2018
Ansible top 10 -  2018Ansible top 10 -  2018
Ansible top 10 - 2018
 
How to R.E.A.D: Steps for how to select the correct module @NEWDCamp 2014
How to R.E.A.D: Steps for how to select the correct module @NEWDCamp 2014How to R.E.A.D: Steps for how to select the correct module @NEWDCamp 2014
How to R.E.A.D: Steps for how to select the correct module @NEWDCamp 2014
 
SOA with PHP and Symfony
SOA with PHP and SymfonySOA with PHP and Symfony
SOA with PHP and Symfony
 
Want to write a book in Jupyter - here's how
Want to write a book in Jupyter - here's howWant to write a book in Jupyter - here's how
Want to write a book in Jupyter - here's how
 
The good, the bad, and the ugly of Java API design
The good, the bad, and the ugly of Java API designThe good, the bad, and the ugly of Java API design
The good, the bad, and the ugly of Java API design
 
The good, the bad, and the ugly of Java API design
The good, the bad, and the ugly of Java API designThe good, the bad, and the ugly of Java API design
The good, the bad, and the ugly of Java API design
 
SBW 2016: MultiQC Workshop
SBW 2016: MultiQC WorkshopSBW 2016: MultiQC Workshop
SBW 2016: MultiQC Workshop
 
The good, the bad, and the ugly of Java API design
The good, the bad, and the ugly of Java API designThe good, the bad, and the ugly of Java API design
The good, the bad, and the ugly of Java API design
 
Introduction to the intermediate Python - v1.1
Introduction to the intermediate Python - v1.1Introduction to the intermediate Python - v1.1
Introduction to the intermediate Python - v1.1
 
[DevDay 2017] ReactJS Hands on - Speaker: Binh Phan - Developer at mgm techno...
[DevDay 2017] ReactJS Hands on - Speaker: Binh Phan - Developer at mgm techno...[DevDay 2017] ReactJS Hands on - Speaker: Binh Phan - Developer at mgm techno...
[DevDay 2017] ReactJS Hands on - Speaker: Binh Phan - Developer at mgm techno...
 
Functional Programming in Java
Functional Programming in JavaFunctional Programming in Java
Functional Programming in Java
 
Come si applica l'OCP
Come si applica l'OCPCome si applica l'OCP
Come si applica l'OCP
 
SciPipe - A light-weight workflow library inspired by flow-based programming
SciPipe - A light-weight workflow library inspired by flow-based programmingSciPipe - A light-weight workflow library inspired by flow-based programming
SciPipe - A light-weight workflow library inspired by flow-based programming
 

More from Miro Cupak

Exploring the latest and greatest from Java 14
Exploring the latest and greatest from Java 14Exploring the latest and greatest from Java 14
Exploring the latest and greatest from Java 14Miro Cupak
 
Exploring reactive programming in Java
Exploring reactive programming in JavaExploring reactive programming in Java
Exploring reactive programming in JavaMiro Cupak
 
Exploring the last year of Java
Exploring the last year of JavaExploring the last year of Java
Exploring the last year of JavaMiro Cupak
 
Local variable type inference - Will it compile?
Local variable type inference - Will it compile?Local variable type inference - Will it compile?
Local variable type inference - Will it compile?Miro Cupak
 
The Good, the Bad and the Ugly of Java API design
The Good, the Bad and the Ugly of Java API designThe Good, the Bad and the Ugly of Java API design
The Good, the Bad and the Ugly of Java API designMiro Cupak
 
Local variable type inference - Will it compile?
Local variable type inference - Will it compile?Local variable type inference - Will it compile?
Local variable type inference - Will it compile?Miro Cupak
 
Exploring reactive programming in Java
Exploring reactive programming in JavaExploring reactive programming in Java
Exploring reactive programming in JavaMiro Cupak
 
The good, the bad, and the ugly of Java API design
The good, the bad, and the ugly of Java API designThe good, the bad, and the ugly of Java API design
The good, the bad, and the ugly of Java API designMiro Cupak
 
Exploring reactive programming in Java
Exploring reactive programming in JavaExploring reactive programming in Java
Exploring reactive programming in JavaMiro Cupak
 
Writing clean code with modern Java
Writing clean code with modern JavaWriting clean code with modern Java
Writing clean code with modern JavaMiro Cupak
 
Exploring reactive programming in Java
Exploring reactive programming in JavaExploring reactive programming in Java
Exploring reactive programming in JavaMiro Cupak
 
Writing clean code with modern Java
Writing clean code with modern JavaWriting clean code with modern Java
Writing clean code with modern JavaMiro Cupak
 
Exploring what's new in Java 10 and 11 (and 12)
Exploring what's new in Java 10 and 11 (and 12)Exploring what's new in Java 10 and 11 (and 12)
Exploring what's new in Java 10 and 11 (and 12)Miro Cupak
 
Exploring what's new in Java 10 and 11
Exploring what's new in Java 10 and 11Exploring what's new in Java 10 and 11
Exploring what's new in Java 10 and 11Miro Cupak
 
Exploring what's new in Java in 2018
Exploring what's new in Java in 2018Exploring what's new in Java in 2018
Exploring what's new in Java in 2018Miro Cupak
 
Reactive programming in Java
Reactive programming in JavaReactive programming in Java
Reactive programming in JavaMiro Cupak
 
Exploring reactive programming with Java
Exploring reactive programming with JavaExploring reactive programming with Java
Exploring reactive programming with JavaMiro Cupak
 
Exploring reactive programming in Java
Exploring reactive programming in JavaExploring reactive programming in Java
Exploring reactive programming in JavaMiro Cupak
 
Writing clean code with Java in 2018
Writing clean code with Java in 2018Writing clean code with Java in 2018
Writing clean code with Java in 2018Miro Cupak
 
Exploring reactive programming in Java
Exploring reactive programming in JavaExploring reactive programming in Java
Exploring reactive programming in JavaMiro Cupak
 

More from Miro Cupak (20)

Exploring the latest and greatest from Java 14
Exploring the latest and greatest from Java 14Exploring the latest and greatest from Java 14
Exploring the latest and greatest from Java 14
 
Exploring reactive programming in Java
Exploring reactive programming in JavaExploring reactive programming in Java
Exploring reactive programming in Java
 
Exploring the last year of Java
Exploring the last year of JavaExploring the last year of Java
Exploring the last year of Java
 
Local variable type inference - Will it compile?
Local variable type inference - Will it compile?Local variable type inference - Will it compile?
Local variable type inference - Will it compile?
 
The Good, the Bad and the Ugly of Java API design
The Good, the Bad and the Ugly of Java API designThe Good, the Bad and the Ugly of Java API design
The Good, the Bad and the Ugly of Java API design
 
Local variable type inference - Will it compile?
Local variable type inference - Will it compile?Local variable type inference - Will it compile?
Local variable type inference - Will it compile?
 
Exploring reactive programming in Java
Exploring reactive programming in JavaExploring reactive programming in Java
Exploring reactive programming in Java
 
The good, the bad, and the ugly of Java API design
The good, the bad, and the ugly of Java API designThe good, the bad, and the ugly of Java API design
The good, the bad, and the ugly of Java API design
 
Exploring reactive programming in Java
Exploring reactive programming in JavaExploring reactive programming in Java
Exploring reactive programming in Java
 
Writing clean code with modern Java
Writing clean code with modern JavaWriting clean code with modern Java
Writing clean code with modern Java
 
Exploring reactive programming in Java
Exploring reactive programming in JavaExploring reactive programming in Java
Exploring reactive programming in Java
 
Writing clean code with modern Java
Writing clean code with modern JavaWriting clean code with modern Java
Writing clean code with modern Java
 
Exploring what's new in Java 10 and 11 (and 12)
Exploring what's new in Java 10 and 11 (and 12)Exploring what's new in Java 10 and 11 (and 12)
Exploring what's new in Java 10 and 11 (and 12)
 
Exploring what's new in Java 10 and 11
Exploring what's new in Java 10 and 11Exploring what's new in Java 10 and 11
Exploring what's new in Java 10 and 11
 
Exploring what's new in Java in 2018
Exploring what's new in Java in 2018Exploring what's new in Java in 2018
Exploring what's new in Java in 2018
 
Reactive programming in Java
Reactive programming in JavaReactive programming in Java
Reactive programming in Java
 
Exploring reactive programming with Java
Exploring reactive programming with JavaExploring reactive programming with Java
Exploring reactive programming with Java
 
Exploring reactive programming in Java
Exploring reactive programming in JavaExploring reactive programming in Java
Exploring reactive programming in Java
 
Writing clean code with Java in 2018
Writing clean code with Java in 2018Writing clean code with Java in 2018
Writing clean code with Java in 2018
 
Exploring reactive programming in Java
Exploring reactive programming in JavaExploring reactive programming in Java
Exploring reactive programming in Java
 

Recently uploaded

Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AIABDERRAOUF MEHENNI
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionSolGuruz
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsArshad QA
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about usDynamic Netsoft
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...harshavardhanraghave
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendArshad QA
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...MyIntelliSource, Inc.
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...MyIntelliSource, Inc.
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfjoe51371421
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...OnePlan Solutions
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxComplianceQuest1
 
Active Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfActive Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfCionsystems
 
Clustering techniques data mining book ....
Clustering techniques data mining book ....Clustering techniques data mining book ....
Clustering techniques data mining book ....ShaimaaMohamedGalal
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️Delhi Call girls
 

Recently uploaded (20)

Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about us
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and Backend
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdf
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 
Active Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfActive Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdf
 
Clustering techniques data mining book ....
Clustering techniques data mining book ....Clustering techniques data mining book ....
Clustering techniques data mining book ....
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
Exploring iOS App Development: Simplifying the Process
Exploring iOS App Development: Simplifying the ProcessExploring iOS App Development: Simplifying the Process
Exploring iOS App Development: Simplifying the Process
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 

Master class in Java in 2018

  • 1. @mirocupak Miro Cupak VP Engineering, DNAstack 18/11/2018 Master class in Java in 2018
  • 2. @mirocupak Lessons !2 • Lesson 1: JShell. • Lesson 2: Convenience factory methods for collections. • Lesson 3: Improved try-with-resources. • Lesson 4: Stream API enhancements. • Lesson 5: Extensions to Optional. • Lesson 6: CompletableFuture updates. • Lesson 7: Reactive streams. • Lesson 8: Process API. • Lesson 9: HTTP/2 client. • Lesson 10: Local variable type inference.
  • 3. @mirocupak Organization !3 • 10 independent lessons • lesson structure: • theory • demo • exercises • solutions • best practices • (optional) reading • environment: JShell
  • 4. @mirocupak Setup !4 • Prerequisites: • JDK 11: https://jdk.java.net/11/ • Familiarity with Java 8. • These slides. Task 0.1 Verify you have JDK 11 with java -version.
  • 6. @mirocupak Lesson 1: JShell !6 Task 1.1 Start and exit JShell.
  • 7. @mirocupak Lesson 1: JShell !7 Task 1.2 Create a variable containing a string. Redefine the variable to contain an integer.
  • 8. @mirocupak Lesson 1: JShell !8 Task 1.3 Call a method that might throw a (checked) exception. How is it handled? What happens when an exception is thrown? How is a location in JShell referenced in a stacktrace?
  • 9. @mirocupak Lesson 1: JShell !9 Task 1.4 Create a simple method and call it. Create a class containing a method and call it.
  • 10. @mirocupak Lesson 1: JShell !10 Task 1.5 Modify your method to call another method that you haven’t implemented yet. What happens?
  • 11. @mirocupak Lesson 1: JShell !11 Task 1.6 Show the current time.
  • 12. @mirocupak Lesson 1: JShell !12 Task 1.7 Find what keyboard shortcuts JShell supports. Try them out. How do you view Javadoc?
  • 13. @mirocupak Lesson 1: JShell !13 Task 1.8 What are the possible arguments for the /list and /edit commands?
  • 14. @mirocupak Lesson 1: JShell !14 Task 1.9 Save your current snippets, restart JShell, and load the snippets you saved. Save all the commands and snippets for later use.
  • 15. @mirocupak Lesson 1: JShell !15 Task 1.10 Explore the /env command. Load an external library and use it from JShell. Unload it when done.
  • 16. @mirocupak Lesson 1: JShell !16 Task 1.11 Set the feedback mode and editor to whatever you’re comfortable with.
  • 17. @mirocupak Lesson 1: JShell !17 Task 1.12 Use JShell to explore its own API. Use the API to process a snippet of your choice and read the results.
  • 18. @mirocupak Lesson 1: JShell !18 • Useful tool for whenever you need to try out something small quickly. • Not a debugging tool. • Prefer IDEs for any larger tasks. • Use /help for more information about commands. • Configure your own editor. • More info: JEP 222: jshell: The Java Shell (Read-Eval-Print Loop).
  • 19. @mirocupak !19 Convenience factory methods for collections Lesson 2
  • 20. @mirocupak Lesson 2: Convenience factory methods for collections !20 Task 2.1 How would you create an immutable set in Java 8? What are the problems with this approach? Are there any alternatives?
  • 21. @mirocupak Lesson 2: Convenience factory methods for collections !21 Task 2.2 What is the type of the return value of the of method?
  • 22. @mirocupak Lesson 2: Convenience factory methods for collections !22 Task 2.3 What’s the API for creating immutable collections for Set and Map? Does it differ from List?
  • 23. @mirocupak Lesson 2: Convenience factory methods for collections !23 Task 2.4 What’s the API for creating immutable copies of collections for a Map? How does it differ from the respective API in List and Set?
  • 24. @mirocupak Lesson 2: Convenience factory methods for collections !24 Task 2.5 How do you get the output of a stream into an immutable collection?
  • 25. @mirocupak !25 • Obtain immutable collections via of/ofEntries methods. • Create immutable copies of collections via copyOf (Java 10). • Static import java.util.Map.entry. • Less verbose, no static initializer blocks. • Don’t use Arrays.asList or Stream.of as shortcuts for creating collections. • Don’t use external libraries if you only need immutable collections (Guava). • No need to worry about leaving references to underlying collections. • Thread-safe and can be shared freely (no need for defensive copies). Lesson 2: Convenience factory methods for collections
  • 26. @mirocupak !26 • Good performance. • Don’t create mutable collections unless necessary. • More info: JEP 269: Convenience Factory Methods for Collections. Lesson 2: Convenience factory methods for collections
  • 28. @mirocupak Lesson 3: Improved try-with- resources !28 Task 3.1 Read a file from disk to standard output (copy to standard output). Make sure you clean up the resources as needed.
  • 29. @mirocupak Lesson 3: Improved try-with- resources !29 Task 3.2 Refactor your previous example to take advantage of effectively final variables.
  • 30. @mirocupak Lesson 3: Improved try-with- resources !30 Task 3.3 Can we make the code even simpler? Hint: Check out the InputStream API for useful methods.
  • 31. @mirocupak !31 • Always prefer try-with-resources, don’t use try-finally and definitely don’t use finalizers to close resources. • Be aware of convenience methods, such as InputStream.transferTo. • Don’t create unnecessary helper objects. • More info: JEP 213: Milling Project Coin. Lesson 3: Improved try-with- resources
  • 32. @mirocupak !32 Stream API enhancements Lesson 4
  • 33. @mirocupak Lesson 4: Stream API enhancements !33 Task 4.1 Modify the stream below to only print the numbers <5 (>5). IntStream.range(0,10).forEach(System.out::println)
  • 34. @mirocupak Lesson 4: Stream API enhancements !34 Task 4.2 Demonstrate a difference between filter and takeWhile (dropWhile). Hint: Print even numbers <100.
  • 35. @mirocupak Lesson 4: Stream API enhancements !35 Task 4.3 Improve the code from the previous task.
  • 36. @mirocupak Lesson 4: Stream API enhancements !36 Task 4.4 Come up with a scenario where ofNullable helps.
  • 37. @mirocupak Lesson 4: Stream API enhancements !37 Task 4.5 Suppose we have the following list of numbers: List.of(2, 3, 4, 7, 9, 11) Count the numbers >5 by parity. Hint: filtering.
  • 38. @mirocupak Lesson 4: Stream API enhancements !38 Task 4.6 Explore how the pattern matching API plays nicely with streams. Hint: Use Matcher to obtain all results of a match.
  • 39. @mirocupak Lesson 4: Stream API enhancements !39 Task 4.7 Explore how the date-time API plays nicely with streams. Hint: Use LocalDate to obtain list of dates between now and Christmas.
  • 40. @mirocupak !40 • Be aware of new stream methods: takeWhile, dropWhile, iterate. • Familiarize yourself with various collectors available out of the box. • Prefer collecting into immutable collections using toUnmodifiableList, toUnmodifiableSet, toUnmodifiableMap. • Check for convenience stream methods before converting to streams manually (e.g. LocalDate, Matcher). • Avoid unnecessary null checks with ofNullable. • Streams are suitable for more use cases now, but not all use cases. • Don’t overuse streams as they can make code hard to read and difficult to maintain. Lesson 4: Stream API enhancements
  • 41. @mirocupak !41 Extensions to Optional Lesson 5
  • 42. @mirocupak Lesson 5: Extensions to Optional !42 Task 5.1 Given an Optional, print its value if the value is present, otherwise print “empty”.
  • 43. @mirocupak Lesson 5: Extensions to Optional !43 Task 5.2 What other methods in the Optional API are similar to or?
  • 44. @mirocupak Lesson 5: Extensions to Optional !44 Task 5.3 Another 2 methods in the same family were added in Java 10. Can you find them?
  • 45. @mirocupak Lesson 5: Extensions to Optional !45 Task 5.4 Filter out empty values from a given collection of Optionals, e.g.: List.of(Optional.of(1), Optional.empty(), Optional.of(2)) Hint: flatMap.
  • 46. @mirocupak !46 • Use ifPresentOrElse instead of if-isPresent construct. • or provides a clean fluent way of chaining behaviour on Optionals. • Be aware of orElse* methods, e.g. the new orElseThrow (Java 10). • Use stream to take advantage of the lazy nature of streams and handle streams of Optionals. • Remember that isPresent is rarely the answer. Lesson 5: Extensions to Optional
  • 48. @mirocupak Lesson 6: CompletableFuture updates !48 Task 6.1 completeOnTimeout is great for completing a future normally based on a timeout. How do I complete a future exceptionally based on a timeout?
  • 49. @mirocupak Lesson 6: CompletableFuture updates !49 Task 6.2 Inspect the contract of the copy method. Demonstrate the one-way synchronization it provides.
  • 50. @mirocupak Lesson 6: CompletableFuture updates !50 Task 6.3 Take some time to explore other new additions to the CompletableFuture API we haven’t talked about.
  • 51. @mirocupak !51 • With Java 9+, you can complete CompletableFutures normally and exceptionally based on a timeout (completeOnTimeout, orTimeout). • copy provides an easy method for building asynchronous APIs. • It’s usually a good idea to make copies before exposing CompletableFuture in APIs. • Be aware of the various utility methods in the CompletableFuture API. • More info: JEP 266: More Concurrency Updates. Lesson 6: CompletableFuture updates
  • 53. @mirocupak Lesson 7: Reactive streams !53 Task 7.1 Implement a subscriber echoing messages from the publisher. Hint: Request new message in onSubscribe and onNext.
  • 54. @mirocupak Lesson 7: Reactive streams !54 Task 7.2 What happens if we request 2 messages in onNext every time? How about Long.MAX_VALUE?
  • 55. @mirocupak Lesson 7: Reactive streams !55 Task 7.3 What happens if we request 0 messages in onNext every time?
  • 56. @mirocupak Lesson 7: Reactive streams !56 Task 7.4 What happens if we subscribe a subscriber twice to a publisher?
  • 57. @mirocupak Lesson 7: Reactive streams !57 Task 7.5 What happens if we subscribe a subscriber to 2 publishers?
  • 58. @mirocupak Lesson 7: Reactive streams !58 Task 7.6 What happens if we submit a message after closing the publisher?
  • 59. @mirocupak !59 • The right approach for asynchronous stream processing with nonblocking back pressure. • Don’t implement yourself, use a library. • More info: JEP 266: More Concurrency Updates. Lesson 7: Reactive streams
  • 61. @mirocupak Lesson 8: Process API !61 Task 8.1 Launch an external process from Java. What are the problems with this API?
  • 62. @mirocupak Lesson 8: Process API !62 Task 8.2 List all the commands running in your OS visible to you. Hint: allProcesses.
  • 63. @mirocupak Lesson 8: Process API !63 Task 8.3 Launch an external process that runs for 3 seconds. Print the PID of the (now dead) process as soon as it finishes. Hint: sleep 3.
  • 64. @mirocupak Lesson 8: Process API !64 Task 8.4 List your currently running Java processes with jps. Use grep to find JShell in the list. Hint: startPipeline.
  • 65. @mirocupak !65 • ProcessHandle is a clean way of obtaining information about processes. • Don’t implement yourself. Don’t use MXBeans or OS utilities. • Take advantage of convenience methods: pid, info, command… • Trigger actions on process termination via onExit. • Connect ProcessBuilder with ProcessHandle via toHandle. • Create pipelines via ProcessBuilder.startPipeline. • More info: JEP 102: Process API Updates. Lesson 8: Process API
  • 67. @mirocupak !67 Task 9.1 Use the new HTTP/2 client API to execute a request against a server. Read the response. Lesson 9: HTTP/2 client
  • 68. @mirocupak !68 Task 9.2 Use the new HTTP/2 client API to execute a request against a server asynchronously. Read the response. Lesson 9: HTTP/2 client
  • 69. @mirocupak Lesson 9: HTTP/2 client !69 • Clean separation: HttpClient, HttpRequest, HttpResponse. • HttpURLConnection is not pleasant to use. • Avoid APIs with side effects. • The new client API is versatile, flexible and clean. • Prefer functionality in the JDK to external libraries. • But aware it’s an incubator module. • More info: JEP 110: HTTP 2 Client.
  • 70. @mirocupak !70 Local variable type inference Lesson 10
  • 71. @mirocupak Lesson 10: Local variable type inference !71 • Does not replace static typing. • Generally good. • Reduces boilerplate and improves readability. • Helps with maintenance and refactoring. • Use for local variables with initializers (especially constructors) and for loops. • Can’t use for method formals, constructor formals, method return types, fields, catch formals, null or array initializers, lambdas, method references, or any other kind of variable declaration. • Consider whether to use when the generated type is not obvious. • But use for complex types when breaking chained or nested expressions with local variables. • Primitive types might surprise you, be careful (e.g. byte, short, long all inferred as int).
  • 72. @mirocupak !72 • Be very careful about combining with <> and generic methods (e.g. var list = new ArrayList<>()). • Probably not the best idea to use with anonymous classes. • Use carefully chosen and expressive variable names. • Don’t use Hungarian notation. • Don’t rely on IDEs. • Minimize the scope of local variables. • Declare variable when it’s first used. • Declaration not containing an initializer (i.e. you can’t use var) often indicates the scope is not minimal. • Prefer for loops to while loops. • Keep methods small and focused. • Code to the interface pattern does not work, but that’s kind of OK. • More info: JEP 286: Local-Variable Type Inference. Lesson 10: Local variable type inference