SlideShare a Scribd company logo
Java 8
What could possibly go wrong?
Grzegorz Rozniecki (@xaerxess)
October 11, 2016
About me
@xaerxess
Important: Images used in this presentation (and the presentation itself) are free to use under Creative Commons Attribution
License.
Code (reviews) addict Open Source advocate
I’m a software engineer who enjoys learning and likes sharing his knowledge. Big GNU/Linux fan and Open
Source Software advocate. I’ve developed software in various languages, including Perl, JavaScript, Java, Python,
PHP and Lisp (and experimented with few others).
● Being a programmer is mostly reading
code, not writing
● You are not your code!
● Freedom is important
● You can read how libraries, languages,
even operating systems are built - and
learn!
● Contribute, it’s easy!
Who?
Why?
What?
Where?
What now?
WHO uses Java 8
Quick journey from 1995 to 2016
1.7
1.6
1.5
1.2-1.4
<=1.1
Java 8 adoption
Java versions as of March 2016
October 201427%
38%
64%
May 2015
March 2016
WHY Java 8
(rhetorical)
lambdas
streams
Date API
Optional
CompletableFuture
Allows functional programming!method references
WHY it’s important?
default methods
Programming styles
...?
Why he’s talking about…
Programming styles
Imperative Declarative Functional
The focus is on what
steps the computer
should take rather than
what the computer will
do (ex. C, C++, Java).
The focus is on what
the computer should
do rather than how it
should do it (ex. SQL).
A subset of declarative
languages that has
heavy focus on
recursion.
Streams
java.util.stream
Classes in the new java.util.stream package
provide a Stream API to support
functional-style operations on streams of
elements. The Stream API is integrated into
the Collections API, which enables bulk
operations on collections, such as sequential
or parallel map-reduce transformations.
● Sequential
● Parallel
● Unordered?
“
”
Parallel streams
Tasks in ForkJoinPool
into smaller pieces
split
new subtasks
fork
computed tasks
join
1 2 3 4
results from pieces
compose
Parallel
streams
List<Integer> primes = IntStream
.range(1, 1_000_000)
.parallel()
.filter(PrimesPrint::isPrime)
.collect(toList());
// how many threads is this using?
// how do I configure that?
Defaults
// see ForkJoinPool Javadoc
-Djava.util.concurrent.ForkJoinPool.common.parallelism=4
Parallel
streams
ForkJoinPool forkJoinPool = new ForkJoinPool(2);
forkJoinPool.submit(() ->
IntStream.range(1, 1_000_000).parallel()
.filter(PrimesPrint::isPrime)
.collect(toList())
).get();
Custom ForkJoinPool
WHAT should I
use?
Effective Java, Item 47: Know and use
your libraries
Libraries
jOOL / jOOλ StreamEx Javaslang
● Almost drop-in
replacement
(extension) of
Stream
● Only sequential
● SQL-like collectors
● Adds TupleN,
FunctionN
● More goodies than
in jOOL
● Also parallel and
primitive streams
● Even
MoreCollectors
● Adds TupleN,
FunctionN
● “Go functional”
● Fully functional
library for Java 8+
● Adds functional
collection library
● Adds TupleN,
FunctionN and
much more (vide
currying)
Problem
static final ImmutableList<String> DATA = ImmutableList.of("foo", "bar", "baz", "bazinga");
static final String[] ARRAY_DATA = DATA.stream().toArray(String[]::new);
static final Iterable<String> ITERABLE_DATA = DATA;
static final Iterator<String> ITERATOR_DATA = DATA.iterator(); // don't do this at home or work!
How create Stream?
DATA.stream();
Arrays.stream(ARRAY_DATA);
StreamSupport.stream(ITERABLE_DATA.spliterator(), false);
StreamSupport.stream(
Spliterators.spliteratorUnknownSize(ITERATOR_DATA, Spliterator.ORDERED),
false);
Solution - jOOL
static final ImmutableList<String> DATA = ImmutableList.of("foo", "bar", "baz", "bazinga");
static final String[] ARRAY_DATA = DATA.stream().toArray(String[]::new);
static final Iterable<String> ITERABLE_DATA = DATA;
static final Iterator<String> ITERATOR_DATA = DATA.iterator(); // don't do this at home or work!
How create Stream?
Seq.seq(DATA);
Seq.seq(ARRAY_DATA);
Seq.seq(ITERABLE_DATA);
Seq.seq(DATA);
Solution - jOOL (fixed)
static final ImmutableList<String> DATA = ImmutableList.of("foo", "bar", "baz", "bazinga");
static final String[] ARRAY_DATA = DATA.stream().toArray(String[]::new);
static final Iterable<String> ITERABLE_DATA = DATA;
static final Iterator<String> ITERATOR_DATA = DATA.iterator(); // don't do this at home or work!
How create Stream?
Seq.seq(DATA);
Seq.of(ARRAY_DATA);
Seq.seq(ITERABLE_DATA);
Seq.seq(DATA);
We checked exceptions!
Arrays.stream(dir.listFiles()).forEach(file -> {
try {
System.out.println(file.getCanonicalPath());
} catch (IOException e) {
throw new RuntimeException(e);
}
// Ouch, my fingers hurt! All this typing!
});
...especially in streams
Arrays.stream(dir.listFiles())
.map(Unchecked.function(File::getCanonicalPath))
.forEach(System.out::println);
Libraries
On a high level: jOOλ
extends/wraps the Java
collections. Javaslang ships with
their own collections.
/ Lukas Eder, creator of jOOL
Which is the best?
I suspect, jOOλ is good for quick
wins, whereas Javaslang is a
strategic decision.
CompletableFuture
and CompletionStage
● ~50 methods
● Concept from JS promises
● What could go wrong?
Top tip
Remembering
CompletableFuture API
// CompletableFuture<T> future;
public interface Function<T, R> {
R apply(T t);
}
future.thenApply(function) // CompletableFuture<R>
public interface Consumer<T> {
void accept(T t);
}
future.thenAccept(consumer) // CompletableFuture<Void>
+ xxxAsync for custom Executor
Date API
java.time
The main API for dates, times, instants, and
durations. (...) They are based on the ISO
calendar system, which is the de facto world
calendar following the proleptic Gregorian
rules. All the classes are immutable and
thread-safe.
“
Dates and parsing
String value = "2001-08-22 03:04:05.321 America/Los_Angeles";
LocalDateTime localDateTime = LocalDateTime.now(ZoneId.of(value.substring(23, value.length()).trim()))
.with(LocalDateTime.parse(value.substring(0, 23).trim(), TIMESTAMP));
System.out.println(localDateTime); // 2001-08-22T03:04:05.321
Custom format
Dates and parsing
private static final DateTimeFormatter DATE = DateTimeFormatter.ofPattern("yyyy-MM-dd");
private static final DateTimeFormatter TIME = DateTimeFormatter.ofPattern("HH:mm:ss.SSS");
private static final DateTimeFormatter TIMESTAMP_WITH_TIME_ZONE = new DateTimeFormatterBuilder()
.append(DATE)
.appendLiteral(' ')
.append(TIME)
.appendLiteral(' ')
.appendZoneId()
.toFormatter();
String value = "2001-08-22 03:04:05.321 America/Los_Angeles";
LocalDateTime localDateTime = LocalDateTime.parse(value, TIMESTAMP_WITH_TIME_ZONE);
System.out.println(localDateTime); // 2001-08-22T03:04:05.321
DateTimeFormatterBuilder
Dates and parsing
private static final DateTimeFormatter TIMESTAMP_WITH_TIME_ZONE = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE)
.appendLiteral(' ')
.append(DateTimeFormatter.ISO_LOCAL_TIME)
.appendLiteral(' ')
.appendZoneId()
.toFormatter();
String value = "2001-08-22 03:04:05.321 America/Los_Angeles";
LocalDateTime localDateTime = LocalDateTime.parse(value, TIMESTAMP_WITH_TIME_ZONE);
System.out.println(localDateTime); // 2001-08-22T03:04:05.321
DateTimeFormatterBuilder
Duration
// shiny new Duration class!
long durationMillis = 1000L;
TimeUnit unit = TimeUnit.MILLISECONDS;
Duration duration = Duration.of(durationMillis, unit);
What’s wrong with these examples?
// so let's use proper units
Duration duration = Duration.of(2, ChronoUnit.MONTHS);
java.time.temporal.UnsupportedTemporalTypeException: Unit must not have an estimated duration
Optional
To be, or not to be… (aka avoiding null)
Sigh, why does everything related to
Optional have to take 300 messages?
”Brian Goetz (2013-10-23 on
lambda-libs-spec-experts)
“
Junior Developer taking advice before starting work on a
legacy project
http://classicprogrammerpaintings.com/
Optional
Problems
● OptionalResult
Naming is hard...
● Optional#getOrElseThrowNoSuchElementException()
Naming is hard… again.
● Implements Serializable?
Deliberately not.
● If / else on Optional?
Vide using .get().
● Optional#stream()
Use stream.flatMap(Optional::stream) instead of:
stream.filter(Optional::isPresent).map(Optional::get)
Optional
Rules
1. Never, ever, use null for an Optional variable or
return value.
2. Never use Optional.get() unless you can prove
that the Optional is present.
3. Prefer alternatives APIs over Optional.isPresent()
and Optional.get().
4. It’s generally a bad idea to create an Optional
for the specific purpose of chaining methods
from it to get a value.
5. If an Optional chain has a nested Optional chain,
or has an intermediate result of
Optional<Optional<T>>, it’s probably too
complex.
6. Avoid using Optional in fields, method
parameters, and collections.
7. Don’t use an Optional to wrap any collection
type (List, Set, Map). Instead, use an empty
collection to represent the absence of values.
WHERE should I
find answers?
Contribute!
That’s all
(questions?)
Thank you for your
participation!

More Related Content

PDF
Identifying memory leaks in Android applications
PPTX
Hadoop cluster performance profiler
PPTX
Java concurrency questions and answers
PDF
Smart Migration to JDK 8
PDF
JProfiler / an introduction
PPTX
Lambda Expressions in Java 8
PPTX
Android - Preventing common memory leaks
PDF
Streams in Java 8
Identifying memory leaks in Android applications
Hadoop cluster performance profiler
Java concurrency questions and answers
Smart Migration to JDK 8
JProfiler / an introduction
Lambda Expressions in Java 8
Android - Preventing common memory leaks
Streams in Java 8

What's hot (20)

PDF
Profiler Guided Java Performance Tuning
PDF
Functional Thinking - Programming with Lambdas in Java 8
PDF
Code transformation With Spoon
ODP
Lambda Chops - Recipes for Simpler, More Expressive Code
PPTX
Java 8 lambda
PPTX
New Features in JDK 8
PDF
Concurrency Utilities in Java 8
PDF
Java 8 ​and ​Best Practices
PPTX
10 Sets of Best Practices for Java 8
PDF
Reactive Android: RxJava and beyond
PDF
Complete Java Course
PPT
Java 8 Streams
PPTX
Java 8 streams
PDF
PDF
Java8 features
PPTX
Java 8 presentation
PPTX
New Features of JAVA SE8
PPTX
JProfiler8 @ OVIRT
PPT
Taking User Input in Java
PPTX
Java 7 & 8
Profiler Guided Java Performance Tuning
Functional Thinking - Programming with Lambdas in Java 8
Code transformation With Spoon
Lambda Chops - Recipes for Simpler, More Expressive Code
Java 8 lambda
New Features in JDK 8
Concurrency Utilities in Java 8
Java 8 ​and ​Best Practices
10 Sets of Best Practices for Java 8
Reactive Android: RxJava and beyond
Complete Java Course
Java 8 Streams
Java 8 streams
Java8 features
Java 8 presentation
New Features of JAVA SE8
JProfiler8 @ OVIRT
Taking User Input in Java
Java 7 & 8
Ad

Viewers also liked (8)

PDF
JDD 2016 - Grzegorz Piwowarek - Davaslang - Functional Java Done Right
PDF
JDD 2016 - Tomasz Ducin - Backend-less Development Revisited
PPTX
2016 - Daniel Lebrero - REPL driven development
PDF
JDD 2016 - Christin Gorman - Concurrency in Java
PDF
JDD 2016 - Pawel Byszewski - Kotlin, why?
PDF
JDD 2016 - Pawel Szulc - Writing Your Wwn RDD For Fun And Profit
PDF
JDD 2016 - Michał Balinski, Oleksandr Goldobin - Practical Non Blocking Micro...
PPTX
JDD 2016 - Wojciech Oczkowski - Testowanie Wydajnosci Za Pomoca Narzedzia JMH
JDD 2016 - Grzegorz Piwowarek - Davaslang - Functional Java Done Right
JDD 2016 - Tomasz Ducin - Backend-less Development Revisited
2016 - Daniel Lebrero - REPL driven development
JDD 2016 - Christin Gorman - Concurrency in Java
JDD 2016 - Pawel Byszewski - Kotlin, why?
JDD 2016 - Pawel Szulc - Writing Your Wwn RDD For Fun And Profit
JDD 2016 - Michał Balinski, Oleksandr Goldobin - Practical Non Blocking Micro...
JDD 2016 - Wojciech Oczkowski - Testowanie Wydajnosci Za Pomoca Narzedzia JMH
Ad

Similar to JDD 2016 - Grzegorz Rozniecki - Java 8 What Could Possibly Go Wrong (20)

PPTX
.NET Multithreading/Multitasking
PDF
Java 8 Overview
PPTX
Java/Servlet/JSP/JDBC
KEY
JavaScript Growing Up
PDF
node.js 실무 - node js in practice by Jesang Yoon
PPTX
Java 7 Whats New(), Whats Next() from Oredev
PPTX
DotNetFest - Let’s refresh our memory! Memory management in .NET
PPTX
brief introduction to core java programming.pptx
PDF
How to Reverse Engineer Web Applications
PDF
Short intro to scala and the play framework
PDF
Introduction to clojure
PPT
Understanding Framework Architecture using Eclipse
PDF
Xopus Application Framework
PDF
LibOS as a regression test framework for Linux networking #netdev1.1
PDF
JavaScript Miller Columns
PDF
.NET Fest 2018. Maarten Balliauw. Let’s refresh our memory! Memory management...
PPTX
Exploring .NET memory management - JetBrains webinar
PDF
TorqueBox: The beauty of Ruby with the power of JBoss. Presented at Devnexus...
.NET Multithreading/Multitasking
Java 8 Overview
Java/Servlet/JSP/JDBC
JavaScript Growing Up
node.js 실무 - node js in practice by Jesang Yoon
Java 7 Whats New(), Whats Next() from Oredev
DotNetFest - Let’s refresh our memory! Memory management in .NET
brief introduction to core java programming.pptx
How to Reverse Engineer Web Applications
Short intro to scala and the play framework
Introduction to clojure
Understanding Framework Architecture using Eclipse
Xopus Application Framework
LibOS as a regression test framework for Linux networking #netdev1.1
JavaScript Miller Columns
.NET Fest 2018. Maarten Balliauw. Let’s refresh our memory! Memory management...
Exploring .NET memory management - JetBrains webinar
TorqueBox: The beauty of Ruby with the power of JBoss. Presented at Devnexus...

Recently uploaded (20)

PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Approach and Philosophy of On baking technology
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PPT
Teaching material agriculture food technology
PPTX
A Presentation on Artificial Intelligence
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PPTX
Big Data Technologies - Introduction.pptx
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PPTX
MYSQL Presentation for SQL database connectivity
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Encapsulation_ Review paper, used for researhc scholars
Approach and Philosophy of On baking technology
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Unlocking AI with Model Context Protocol (MCP)
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Per capita expenditure prediction using model stacking based on satellite ima...
Understanding_Digital_Forensics_Presentation.pptx
Teaching material agriculture food technology
A Presentation on Artificial Intelligence
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Big Data Technologies - Introduction.pptx
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Diabetes mellitus diagnosis method based random forest with bat algorithm
Review of recent advances in non-invasive hemoglobin estimation
Network Security Unit 5.pdf for BCA BBA.
The Rise and Fall of 3GPP – Time for a Sabbatical?
MYSQL Presentation for SQL database connectivity

JDD 2016 - Grzegorz Rozniecki - Java 8 What Could Possibly Go Wrong

  • 1. Java 8 What could possibly go wrong? Grzegorz Rozniecki (@xaerxess) October 11, 2016
  • 2. About me @xaerxess Important: Images used in this presentation (and the presentation itself) are free to use under Creative Commons Attribution License. Code (reviews) addict Open Source advocate I’m a software engineer who enjoys learning and likes sharing his knowledge. Big GNU/Linux fan and Open Source Software advocate. I’ve developed software in various languages, including Perl, JavaScript, Java, Python, PHP and Lisp (and experimented with few others). ● Being a programmer is mostly reading code, not writing ● You are not your code! ● Freedom is important ● You can read how libraries, languages, even operating systems are built - and learn! ● Contribute, it’s easy!
  • 4. WHO uses Java 8 Quick journey from 1995 to 2016
  • 6. Java 8 adoption Java versions as of March 2016 October 201427% 38% 64% May 2015 March 2016
  • 8. lambdas streams Date API Optional CompletableFuture Allows functional programming!method references WHY it’s important? default methods
  • 10. Programming styles Imperative Declarative Functional The focus is on what steps the computer should take rather than what the computer will do (ex. C, C++, Java). The focus is on what the computer should do rather than how it should do it (ex. SQL). A subset of declarative languages that has heavy focus on recursion.
  • 11. Streams java.util.stream Classes in the new java.util.stream package provide a Stream API to support functional-style operations on streams of elements. The Stream API is integrated into the Collections API, which enables bulk operations on collections, such as sequential or parallel map-reduce transformations. ● Sequential ● Parallel ● Unordered? “ ”
  • 12. Parallel streams Tasks in ForkJoinPool into smaller pieces split new subtasks fork computed tasks join 1 2 3 4 results from pieces compose
  • 13. Parallel streams List<Integer> primes = IntStream .range(1, 1_000_000) .parallel() .filter(PrimesPrint::isPrime) .collect(toList()); // how many threads is this using? // how do I configure that? Defaults // see ForkJoinPool Javadoc -Djava.util.concurrent.ForkJoinPool.common.parallelism=4
  • 14. Parallel streams ForkJoinPool forkJoinPool = new ForkJoinPool(2); forkJoinPool.submit(() -> IntStream.range(1, 1_000_000).parallel() .filter(PrimesPrint::isPrime) .collect(toList()) ).get(); Custom ForkJoinPool
  • 15. WHAT should I use? Effective Java, Item 47: Know and use your libraries
  • 16. Libraries jOOL / jOOλ StreamEx Javaslang ● Almost drop-in replacement (extension) of Stream ● Only sequential ● SQL-like collectors ● Adds TupleN, FunctionN ● More goodies than in jOOL ● Also parallel and primitive streams ● Even MoreCollectors ● Adds TupleN, FunctionN ● “Go functional” ● Fully functional library for Java 8+ ● Adds functional collection library ● Adds TupleN, FunctionN and much more (vide currying)
  • 17. Problem static final ImmutableList<String> DATA = ImmutableList.of("foo", "bar", "baz", "bazinga"); static final String[] ARRAY_DATA = DATA.stream().toArray(String[]::new); static final Iterable<String> ITERABLE_DATA = DATA; static final Iterator<String> ITERATOR_DATA = DATA.iterator(); // don't do this at home or work! How create Stream? DATA.stream(); Arrays.stream(ARRAY_DATA); StreamSupport.stream(ITERABLE_DATA.spliterator(), false); StreamSupport.stream( Spliterators.spliteratorUnknownSize(ITERATOR_DATA, Spliterator.ORDERED), false);
  • 18. Solution - jOOL static final ImmutableList<String> DATA = ImmutableList.of("foo", "bar", "baz", "bazinga"); static final String[] ARRAY_DATA = DATA.stream().toArray(String[]::new); static final Iterable<String> ITERABLE_DATA = DATA; static final Iterator<String> ITERATOR_DATA = DATA.iterator(); // don't do this at home or work! How create Stream? Seq.seq(DATA); Seq.seq(ARRAY_DATA); Seq.seq(ITERABLE_DATA); Seq.seq(DATA);
  • 19. Solution - jOOL (fixed) static final ImmutableList<String> DATA = ImmutableList.of("foo", "bar", "baz", "bazinga"); static final String[] ARRAY_DATA = DATA.stream().toArray(String[]::new); static final Iterable<String> ITERABLE_DATA = DATA; static final Iterator<String> ITERATOR_DATA = DATA.iterator(); // don't do this at home or work! How create Stream? Seq.seq(DATA); Seq.of(ARRAY_DATA); Seq.seq(ITERABLE_DATA); Seq.seq(DATA);
  • 20. We checked exceptions! Arrays.stream(dir.listFiles()).forEach(file -> { try { System.out.println(file.getCanonicalPath()); } catch (IOException e) { throw new RuntimeException(e); } // Ouch, my fingers hurt! All this typing! }); ...especially in streams Arrays.stream(dir.listFiles()) .map(Unchecked.function(File::getCanonicalPath)) .forEach(System.out::println);
  • 21. Libraries On a high level: jOOλ extends/wraps the Java collections. Javaslang ships with their own collections. / Lukas Eder, creator of jOOL Which is the best? I suspect, jOOλ is good for quick wins, whereas Javaslang is a strategic decision.
  • 22. CompletableFuture and CompletionStage ● ~50 methods ● Concept from JS promises ● What could go wrong?
  • 23. Top tip Remembering CompletableFuture API // CompletableFuture<T> future; public interface Function<T, R> { R apply(T t); } future.thenApply(function) // CompletableFuture<R> public interface Consumer<T> { void accept(T t); } future.thenAccept(consumer) // CompletableFuture<Void> + xxxAsync for custom Executor
  • 24. Date API java.time The main API for dates, times, instants, and durations. (...) They are based on the ISO calendar system, which is the de facto world calendar following the proleptic Gregorian rules. All the classes are immutable and thread-safe. “
  • 25. Dates and parsing String value = "2001-08-22 03:04:05.321 America/Los_Angeles"; LocalDateTime localDateTime = LocalDateTime.now(ZoneId.of(value.substring(23, value.length()).trim())) .with(LocalDateTime.parse(value.substring(0, 23).trim(), TIMESTAMP)); System.out.println(localDateTime); // 2001-08-22T03:04:05.321 Custom format
  • 26. Dates and parsing private static final DateTimeFormatter DATE = DateTimeFormatter.ofPattern("yyyy-MM-dd"); private static final DateTimeFormatter TIME = DateTimeFormatter.ofPattern("HH:mm:ss.SSS"); private static final DateTimeFormatter TIMESTAMP_WITH_TIME_ZONE = new DateTimeFormatterBuilder() .append(DATE) .appendLiteral(' ') .append(TIME) .appendLiteral(' ') .appendZoneId() .toFormatter(); String value = "2001-08-22 03:04:05.321 America/Los_Angeles"; LocalDateTime localDateTime = LocalDateTime.parse(value, TIMESTAMP_WITH_TIME_ZONE); System.out.println(localDateTime); // 2001-08-22T03:04:05.321 DateTimeFormatterBuilder
  • 27. Dates and parsing private static final DateTimeFormatter TIMESTAMP_WITH_TIME_ZONE = new DateTimeFormatterBuilder() .append(DateTimeFormatter.ISO_LOCAL_DATE) .appendLiteral(' ') .append(DateTimeFormatter.ISO_LOCAL_TIME) .appendLiteral(' ') .appendZoneId() .toFormatter(); String value = "2001-08-22 03:04:05.321 America/Los_Angeles"; LocalDateTime localDateTime = LocalDateTime.parse(value, TIMESTAMP_WITH_TIME_ZONE); System.out.println(localDateTime); // 2001-08-22T03:04:05.321 DateTimeFormatterBuilder
  • 28. Duration // shiny new Duration class! long durationMillis = 1000L; TimeUnit unit = TimeUnit.MILLISECONDS; Duration duration = Duration.of(durationMillis, unit); What’s wrong with these examples? // so let's use proper units Duration duration = Duration.of(2, ChronoUnit.MONTHS); java.time.temporal.UnsupportedTemporalTypeException: Unit must not have an estimated duration
  • 29. Optional To be, or not to be… (aka avoiding null) Sigh, why does everything related to Optional have to take 300 messages? ”Brian Goetz (2013-10-23 on lambda-libs-spec-experts) “ Junior Developer taking advice before starting work on a legacy project http://classicprogrammerpaintings.com/
  • 30. Optional Problems ● OptionalResult Naming is hard... ● Optional#getOrElseThrowNoSuchElementException() Naming is hard… again. ● Implements Serializable? Deliberately not. ● If / else on Optional? Vide using .get(). ● Optional#stream() Use stream.flatMap(Optional::stream) instead of: stream.filter(Optional::isPresent).map(Optional::get)
  • 31. Optional Rules 1. Never, ever, use null for an Optional variable or return value. 2. Never use Optional.get() unless you can prove that the Optional is present. 3. Prefer alternatives APIs over Optional.isPresent() and Optional.get(). 4. It’s generally a bad idea to create an Optional for the specific purpose of chaining methods from it to get a value. 5. If an Optional chain has a nested Optional chain, or has an intermediate result of Optional<Optional<T>>, it’s probably too complex. 6. Avoid using Optional in fields, method parameters, and collections. 7. Don’t use an Optional to wrap any collection type (List, Set, Map). Instead, use an empty collection to represent the absence of values.
  • 32. WHERE should I find answers? Contribute!
  • 33. That’s all (questions?) Thank you for your participation!