SlideShare une entreprise Scribd logo
1  sur  73
Télécharger pour lire hors ligne
@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

Contenu connexe

Tendances

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
 

Tendances (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
 

Similaire à 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
 

Similaire à 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
 

Plus de 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
 

Plus de 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
 

Dernier

%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrandmasabamasaba
 
WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationJuha-Pekka Tolvanen
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is insideshinachiaurasa2
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...panagenda
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park masabamasaba
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisamasabamasaba
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisamasabamasaba
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...Health
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech studentsHimanshiGarg82
 
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...masabamasaba
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnAmarnathKambale
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2
 
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benonimasabamasaba
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplatePresentation.STUDIO
 
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park %in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park masabamasaba
 

Dernier (20)

Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the Situation
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park %in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
 

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