SlideShare a Scribd company logo
Writing beautiful code
with Java 8
sergiu.indrie@iquestgroup.com
Disclaimer
This is not a clean code presentation, but rather a code esthetics oriented
presentation which may include clean code.
Beautiful code?
● Easy to read/understand/write
● Concise
● DSL-like
● Clean code ++
Ugly vs Beautiful
for (int i = 0; i < meetings.size(); i++) {
System.out.println(meetings);
}
for (Meeting meeting : meetings) {
System.out.println(meeting);
}
meetings.forEach(System.out::println);
Ugly vs Beautiful
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Complex stuff");
}
}).start();
new Thread(() -> System.out.println("Complex stuff")).start();
Ugly vs Beautiful
Map<String, List<Meeting>> meetingsById = meetings.stream()
.collect(Collectors.groupingBy(Meeting::getId));
Map<String, List<Meeting>> meetingsGrouped = new HashMap<>();
for (Meeting meeting : meetings) {
if (!meetingsGrouped.containsKey(meeting.getId())) {
meetingsGrouped.put(meeting.getId(), new ArrayList<>());
}
meetingsGrouped.get(meeting.getId()).add(meeting);
}
Ugly vs Beautiful
// guarded logging
if (logger.isDebugEnabled()) {
logger.debug("This {} and {} with {} ", 1, that, compute());
}
VS
logger.debug("This {} ", () -> compute());
What’s “new” in Java 8?
● Lambdas
Runnable r2 = () -> System.out.println("Hello world two!");
● Streams
List<Room> rooms = microsoftExchangeService.getRoomLists().getItems().parallelStream()
.filter(this::isValidRoomList)
.map(this::retrieveRoomsInRoomList)
.flatMap(List::stream)
.collect(Collectors.toList());
● Optional
Optional<Meeting> meeting = meetingsDao.findById(meetingId);
meeting.ifPresent(this::setMeetingAsManuallyEnded);
PS - Help from IDEA
● Migration suggestions (more to come in IDEA 2016.3)
Enemy #1: Checked Exceptions
private static void checkedException() {
List<String> strings = Arrays.asList(1, 2, 3, 4, 5).stream()
.map(Exceptions::intToString)
.collect(Collectors.toList());
System.out.println(strings);
}
private static String intToString(Integer number) throws Exception {
if (number == 3) {
throw new Exception("wrong number, pal!");
}
return String.valueOf(number);
}
Enemy #1: Checked Exceptions
● Complex issue (see Brian Goetz’s post from 2010)
○ generic type parameters are monadic ⇒ one exact type
○ throws clauses are variadic ⇒ 0 or more types
● Solution?
Enemy #1: Checked Exceptions - Solution
● 1st Solution - Unchecked Exceptions*
● 2nd Solution - Wrap to 1st (see org.jooq.lambda.Unchecked)
public static <T> T unchecked(Callable<T> callable) {
try {
return callable.call();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
List<Room> rooms = roomAddresses.parallelStream()
.map(room -> unchecked(() -> getRoomWithoutMeetings(room)))
.collect(Collectors.toList());
* Python, Scala, C#, Ruby, PHP … don’t have checked exceptions
Enemy #1: Checked Exceptions - Solution
public static <T> T unchecked(Callable<T> callable) {
try {
return callable.call();
} catch (ApiServiceException e) {
throw new ApiServiceRuntimeException(e);
} catch (Exception e) {
throw runtime(e);
}
}
private static RuntimeException runtime(Throwable e) {
if (e instanceof RuntimeException) {
return (RuntimeException) e;
}
return new RuntimeException(e);
}
Enemy #1: Checked Exceptions - Solution
● A more functional approach
Enemy #1: Checked Exceptions - Solution
● A more functional approach
String complexResult = Try.of(SomeClass::dangerousGet)
.recover(x -> Match(x).of(
Case(instanceOf(IllegalStateException.class), () -> "1st exception"),
Case(instanceOf(IllegalArgumentException.class), () -> "2nd exception")
))
.getOrElse("default2");
By the way
Java 9 brings: Collection Factory Methods* (all immutable)
+ some stream improvements like iterate, take/dropWhile
* Nevermind if you’ve been using Guava, jOOQ
Java 8 is nice, but don’t
// long lambdas
numbers.forEach(e -> {
int count = 0;
for(int i = 1; i <= e; i++) {
if(e % i == 0) count++;
}
System.out.println(count);
});
// unformatted streams
List<String> strings = Arrays.asList(1, 2, 3).stream().map(Object::toString)
.map(String::toUpperCase).limit(5).collect(Collectors.toList());
Java 8 is nice, but
Java 8 Computation Style
Level up: Javaslang
// Java 8
List<Integer> integers = Arrays.asList(1, 2, 3, 4);
List<Integer> evenNumbers = integers.stream()
.filter(nr -> nr % 2 == 0)
.collect(Collectors.toList());
// Javaslang
List<Integer> integers = List.of(1, 2, 3, 4);
List<Integer> evenIntegers = integers.filter(nr -> nr % 2 == 0);
* javaslang.collection.List
Level up: Javaslang
● “...greatly inspired by Scala”
● Hence very functional
● facilitates functional programming through immutability
List<Integer> integers = Arrays.asList(1, 2, 3, 4);
● List is really javaslang.collection.List :) but we do have toJavaList/Array/Collection/Set() etc.
public interface List<T> extends Kind1<List<?>, T>, LinearSeq<T>, Stack<T> {
default java.util.List<T> toJavaList() {
return ValueModule.toJavaCollection(this, new ArrayList<>());
}
● All Javaslang collections are Iterable and thus can be used in enhanced for-statements
for (String s : List.of("Java", "Advent")) {
// side effects and mutation
}
Level up: Javaslang
● Functional exception handling
// no need to handle exceptions
Try.of(SomeClass::bunchOfWork).getOrElse("default");
String complexResult = Try.of(SomeClass::dangerousGet)
.recover(x -> Match(x).of(
Case(instanceOf(IllegalStateException.class), () -> "1st exception"),
Case(instanceOf(IllegalArgumentException.class), () -> "2nd exception")
))
.getOrElse("default2");
Level up: Javaslang
● Lazy
Lazy<Double> lazy = Lazy.of(Math::random);
lazy.isEvaluated(); // = false
lazy.get(); // = 0.123 (random generated)
lazy.isEvaluated(); // = true
lazy.get(); // = 0.123 (memoized)
● + other FP features like function composition, currying, memoization, lifting,
immutable collections, tuples
Level up: Javaslang
Or maybe just switch to Scala :D
// type inference, nice constructors, native streams API, no semicolons :)
val integers = List(1, 2, 3, 4)
val evenIntegers = integers.filter(_ % 2 == 0)
// pre/post/infix operators
val sum = (1 to 10).sum
// immutable, generated equals/getter/toString/hashcode, pattern matching decomposition
case class Person(firstName: String, lastName: String)
object Singleton {}
// immutable collections, XML processing, multiple inheritance, tuples, REPL etc.
Or maybe just switch to Scala :D
// pattern matching & decomposition
object Demo {
def main(args: Array[String]) {
val alice = new Person("Alice", 25)
val charlie = new Person("Charlie", 32)
for (person <- List(alice, charlie)) {
person match {
case Person("Alice", 25) => println("Hi Alice!")
case Person(name, age) => println(
"Age: " + age + " year, name: " + name + "?")
}
}
}
case class Person(name: String, age: Int)
}
References
https://github.com/tedyoung/awesome-java8
https://blog.jooq.org/2014/05/02/java-8-friday-lets-deprecate-those-legacy-libs/
https://blog.jetbrains.com/idea/2016/07/java-8-top-tips/
http://blog.agiledeveloper.com/2015/06/lambdas-are-glue-code.html
https://garygregory.wordpress.com/2015/09/16/a-gentle-introduction-to-the-log4j-api-and-lambda-basics/
https://dzone.com/articles/java-8-functional-interfaces-0
http://openjdk.java.net/jeps/269
https://blogs.oracle.com/briangoetz/entry/exception_transparency_in_java
http://www.artima.com/intv/handcuffs.html
http://www.mindview.net/Etc/Discussions/CheckedExceptions
https://github.com/jOOQ/jOOL#orgjooqlambdaunchecked
http://iteratrlearning.com/java9/2016/08/06/java9-streams.html
http://www.javaslang.io/
http://www.scala-lang.org/
That’s all folks!

More Related Content

PDF
Java Generics - by Example
PDF
Java Class Design
PPTX
Java Generics
PDF
RxJava и Android. Плюсы, минусы, подводные камни
PPTX
Use of Apache Commons and Utilities
PDF
The... Wonderful? World of Lambdas
PDF
OCP Java SE 8 Exam - Sample Questions - Lambda Expressions
PDF
Java 8 Lambda Built-in Functional Interfaces
Java Generics - by Example
Java Class Design
Java Generics
RxJava и Android. Плюсы, минусы, подводные камни
Use of Apache Commons and Utilities
The... Wonderful? World of Lambdas
OCP Java SE 8 Exam - Sample Questions - Lambda Expressions
Java 8 Lambda Built-in Functional Interfaces

What's hot (19)

PDF
Java patterns in Scala
PDF
Java Simple Programs
PDF
Scala is java8.next()
PDF
Java programs
DOCX
ODP
Java Generics
PDF
Java 8 Lambda Expressions
PPTX
Templates
PDF
Coding Guidelines - Crafting Clean Code
PPTX
Java generics
PPT
Java Generics for Dummies
PDF
Refactoring to Java 8 (Devoxx BE)
PPTX
Java simple programs
PDF
Scalaz By Example (An IO Taster) -- PDXScala Meetup Jan 2014
PPTX
Java generics final
DOC
Final JAVA Practical of BCA SEM-5.
PDF
Java Practical File Diploma
PPTX
02 Java Language And OOP PART II
PDF
Java 8 lambda expressions
Java patterns in Scala
Java Simple Programs
Scala is java8.next()
Java programs
Java Generics
Java 8 Lambda Expressions
Templates
Coding Guidelines - Crafting Clean Code
Java generics
Java Generics for Dummies
Refactoring to Java 8 (Devoxx BE)
Java simple programs
Scalaz By Example (An IO Taster) -- PDXScala Meetup Jan 2014
Java generics final
Final JAVA Practical of BCA SEM-5.
Java Practical File Diploma
02 Java Language And OOP PART II
Java 8 lambda expressions
Ad

Viewers also liked (16)

PDF
2 buffer overflows
PDF
Clean Code - How to write comprehensible code regarding cognitive abilities o...
PPTX
Clean Code: Chapter 3 Function
PDF
Redis training for java software engineers
PDF
Empathic Programming - How to write comprehensible code
PPTX
Clean Code Development
PPTX
Clean Code (Presentacion interna en Virtual Software)
PPTX
Clean Code
PPT
OOP Basics
PDF
Java data structures powered by Redis. Introduction to Redisson @ Redis Light...
PPTX
Clean Code I - Best Practices
PDF
Productive Programming in Java 8 - with Lambdas and Streams
PDF
Clean code
POTX
Performance Tuning EC2 Instances
PDF
Clean coding-practices
PDF
Build Features, Not Apps
2 buffer overflows
Clean Code - How to write comprehensible code regarding cognitive abilities o...
Clean Code: Chapter 3 Function
Redis training for java software engineers
Empathic Programming - How to write comprehensible code
Clean Code Development
Clean Code (Presentacion interna en Virtual Software)
Clean Code
OOP Basics
Java data structures powered by Redis. Introduction to Redisson @ Redis Light...
Clean Code I - Best Practices
Productive Programming in Java 8 - with Lambdas and Streams
Clean code
Performance Tuning EC2 Instances
Clean coding-practices
Build Features, Not Apps
Ad

Similar to Writing beautiful code with Java 8 (20)

PPTX
Exception
PPTX
More topics on Java
PDF
Voxxed Athens 2018 - Clean Code with Java9+
PDF
Writing clean code with Java 9+
PDF
Java 8 - A step closer to Parallelism
PPTX
What's new in Java 8
PDF
JavaOne 2016 - Learn Lambda and functional programming
PPTX
Modern Java Development
DOCX
Jist of Java
DOCX
JAVA CONCEPTS AND PRACTICES
PDF
Functional Programming 101 for Java 7 Developers
PPTX
Softshake 2013: 10 reasons why java developers are jealous of Scala developers
KEY
JavaOne 2012 - JVM JIT for Dummies
PDF
Deep Dive in Java 9+
PPTX
Lambdas and Laughs
PDF
A Sceptical Guide to Functional Programming
PDF
core java
PDF
JAVA Interview Questions (1)............pdf
PDF
JAVA Interview Questions (1)..........pdf
KEY
Polyglot and Functional Programming (OSCON 2012)
Exception
More topics on Java
Voxxed Athens 2018 - Clean Code with Java9+
Writing clean code with Java 9+
Java 8 - A step closer to Parallelism
What's new in Java 8
JavaOne 2016 - Learn Lambda and functional programming
Modern Java Development
Jist of Java
JAVA CONCEPTS AND PRACTICES
Functional Programming 101 for Java 7 Developers
Softshake 2013: 10 reasons why java developers are jealous of Scala developers
JavaOne 2012 - JVM JIT for Dummies
Deep Dive in Java 9+
Lambdas and Laughs
A Sceptical Guide to Functional Programming
core java
JAVA Interview Questions (1)............pdf
JAVA Interview Questions (1)..........pdf
Polyglot and Functional Programming (OSCON 2012)

Recently uploaded (20)

PDF
Understanding Forklifts - TECH EHS Solution
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PPTX
Reimagine Home Health with the Power of Agentic AI​
PDF
Upgrade and Innovation Strategies for SAP ERP Customers
PPTX
Computer Software and OS of computer science of grade 11.pptx
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
PDF
How to Choose the Right IT Partner for Your Business in Malaysia
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
PPTX
VVF-Customer-Presentation2025-Ver1.9.pptx
PDF
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
PPTX
CHAPTER 2 - PM Management and IT Context
PPTX
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
PDF
Odoo Companies in India – Driving Business Transformation.pdf
PDF
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
Understanding Forklifts - TECH EHS Solution
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
Reimagine Home Health with the Power of Agentic AI​
Upgrade and Innovation Strategies for SAP ERP Customers
Computer Software and OS of computer science of grade 11.pptx
Adobe Illustrator 28.6 Crack My Vision of Vector Design
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
2025 Textile ERP Trends: SAP, Odoo & Oracle
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
How to Choose the Right IT Partner for Your Business in Malaysia
Which alternative to Crystal Reports is best for small or large businesses.pdf
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
VVF-Customer-Presentation2025-Ver1.9.pptx
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
CHAPTER 2 - PM Management and IT Context
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
Odoo Companies in India – Driving Business Transformation.pdf
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf

Writing beautiful code with Java 8

  • 1. Writing beautiful code with Java 8 sergiu.indrie@iquestgroup.com
  • 2. Disclaimer This is not a clean code presentation, but rather a code esthetics oriented presentation which may include clean code.
  • 3. Beautiful code? ● Easy to read/understand/write ● Concise ● DSL-like ● Clean code ++
  • 4. Ugly vs Beautiful for (int i = 0; i < meetings.size(); i++) { System.out.println(meetings); } for (Meeting meeting : meetings) { System.out.println(meeting); } meetings.forEach(System.out::println);
  • 5. Ugly vs Beautiful new Thread(new Runnable() { @Override public void run() { System.out.println("Complex stuff"); } }).start(); new Thread(() -> System.out.println("Complex stuff")).start();
  • 6. Ugly vs Beautiful Map<String, List<Meeting>> meetingsById = meetings.stream() .collect(Collectors.groupingBy(Meeting::getId)); Map<String, List<Meeting>> meetingsGrouped = new HashMap<>(); for (Meeting meeting : meetings) { if (!meetingsGrouped.containsKey(meeting.getId())) { meetingsGrouped.put(meeting.getId(), new ArrayList<>()); } meetingsGrouped.get(meeting.getId()).add(meeting); }
  • 7. Ugly vs Beautiful // guarded logging if (logger.isDebugEnabled()) { logger.debug("This {} and {} with {} ", 1, that, compute()); } VS logger.debug("This {} ", () -> compute());
  • 8. What’s “new” in Java 8? ● Lambdas Runnable r2 = () -> System.out.println("Hello world two!"); ● Streams List<Room> rooms = microsoftExchangeService.getRoomLists().getItems().parallelStream() .filter(this::isValidRoomList) .map(this::retrieveRoomsInRoomList) .flatMap(List::stream) .collect(Collectors.toList()); ● Optional Optional<Meeting> meeting = meetingsDao.findById(meetingId); meeting.ifPresent(this::setMeetingAsManuallyEnded);
  • 9. PS - Help from IDEA ● Migration suggestions (more to come in IDEA 2016.3)
  • 10. Enemy #1: Checked Exceptions private static void checkedException() { List<String> strings = Arrays.asList(1, 2, 3, 4, 5).stream() .map(Exceptions::intToString) .collect(Collectors.toList()); System.out.println(strings); } private static String intToString(Integer number) throws Exception { if (number == 3) { throw new Exception("wrong number, pal!"); } return String.valueOf(number); }
  • 11. Enemy #1: Checked Exceptions ● Complex issue (see Brian Goetz’s post from 2010) ○ generic type parameters are monadic ⇒ one exact type ○ throws clauses are variadic ⇒ 0 or more types ● Solution?
  • 12. Enemy #1: Checked Exceptions - Solution ● 1st Solution - Unchecked Exceptions* ● 2nd Solution - Wrap to 1st (see org.jooq.lambda.Unchecked) public static <T> T unchecked(Callable<T> callable) { try { return callable.call(); } catch (Exception e) { throw new RuntimeException(e); } } List<Room> rooms = roomAddresses.parallelStream() .map(room -> unchecked(() -> getRoomWithoutMeetings(room))) .collect(Collectors.toList()); * Python, Scala, C#, Ruby, PHP … don’t have checked exceptions
  • 13. Enemy #1: Checked Exceptions - Solution public static <T> T unchecked(Callable<T> callable) { try { return callable.call(); } catch (ApiServiceException e) { throw new ApiServiceRuntimeException(e); } catch (Exception e) { throw runtime(e); } } private static RuntimeException runtime(Throwable e) { if (e instanceof RuntimeException) { return (RuntimeException) e; } return new RuntimeException(e); }
  • 14. Enemy #1: Checked Exceptions - Solution ● A more functional approach
  • 15. Enemy #1: Checked Exceptions - Solution ● A more functional approach String complexResult = Try.of(SomeClass::dangerousGet) .recover(x -> Match(x).of( Case(instanceOf(IllegalStateException.class), () -> "1st exception"), Case(instanceOf(IllegalArgumentException.class), () -> "2nd exception") )) .getOrElse("default2");
  • 16. By the way Java 9 brings: Collection Factory Methods* (all immutable) + some stream improvements like iterate, take/dropWhile * Nevermind if you’ve been using Guava, jOOQ
  • 17. Java 8 is nice, but don’t // long lambdas numbers.forEach(e -> { int count = 0; for(int i = 1; i <= e; i++) { if(e % i == 0) count++; } System.out.println(count); }); // unformatted streams List<String> strings = Arrays.asList(1, 2, 3).stream().map(Object::toString) .map(String::toUpperCase).limit(5).collect(Collectors.toList());
  • 18. Java 8 is nice, but Java 8 Computation Style
  • 19. Level up: Javaslang // Java 8 List<Integer> integers = Arrays.asList(1, 2, 3, 4); List<Integer> evenNumbers = integers.stream() .filter(nr -> nr % 2 == 0) .collect(Collectors.toList()); // Javaslang List<Integer> integers = List.of(1, 2, 3, 4); List<Integer> evenIntegers = integers.filter(nr -> nr % 2 == 0); * javaslang.collection.List
  • 20. Level up: Javaslang ● “...greatly inspired by Scala” ● Hence very functional ● facilitates functional programming through immutability
  • 21. List<Integer> integers = Arrays.asList(1, 2, 3, 4); ● List is really javaslang.collection.List :) but we do have toJavaList/Array/Collection/Set() etc. public interface List<T> extends Kind1<List<?>, T>, LinearSeq<T>, Stack<T> { default java.util.List<T> toJavaList() { return ValueModule.toJavaCollection(this, new ArrayList<>()); } ● All Javaslang collections are Iterable and thus can be used in enhanced for-statements for (String s : List.of("Java", "Advent")) { // side effects and mutation } Level up: Javaslang
  • 22. ● Functional exception handling // no need to handle exceptions Try.of(SomeClass::bunchOfWork).getOrElse("default"); String complexResult = Try.of(SomeClass::dangerousGet) .recover(x -> Match(x).of( Case(instanceOf(IllegalStateException.class), () -> "1st exception"), Case(instanceOf(IllegalArgumentException.class), () -> "2nd exception") )) .getOrElse("default2"); Level up: Javaslang
  • 23. ● Lazy Lazy<Double> lazy = Lazy.of(Math::random); lazy.isEvaluated(); // = false lazy.get(); // = 0.123 (random generated) lazy.isEvaluated(); // = true lazy.get(); // = 0.123 (memoized) ● + other FP features like function composition, currying, memoization, lifting, immutable collections, tuples Level up: Javaslang
  • 24. Or maybe just switch to Scala :D // type inference, nice constructors, native streams API, no semicolons :) val integers = List(1, 2, 3, 4) val evenIntegers = integers.filter(_ % 2 == 0) // pre/post/infix operators val sum = (1 to 10).sum // immutable, generated equals/getter/toString/hashcode, pattern matching decomposition case class Person(firstName: String, lastName: String) object Singleton {} // immutable collections, XML processing, multiple inheritance, tuples, REPL etc.
  • 25. Or maybe just switch to Scala :D // pattern matching & decomposition object Demo { def main(args: Array[String]) { val alice = new Person("Alice", 25) val charlie = new Person("Charlie", 32) for (person <- List(alice, charlie)) { person match { case Person("Alice", 25) => println("Hi Alice!") case Person(name, age) => println( "Age: " + age + " year, name: " + name + "?") } } } case class Person(name: String, age: Int) }
  • 26. References https://github.com/tedyoung/awesome-java8 https://blog.jooq.org/2014/05/02/java-8-friday-lets-deprecate-those-legacy-libs/ https://blog.jetbrains.com/idea/2016/07/java-8-top-tips/ http://blog.agiledeveloper.com/2015/06/lambdas-are-glue-code.html https://garygregory.wordpress.com/2015/09/16/a-gentle-introduction-to-the-log4j-api-and-lambda-basics/ https://dzone.com/articles/java-8-functional-interfaces-0 http://openjdk.java.net/jeps/269 https://blogs.oracle.com/briangoetz/entry/exception_transparency_in_java http://www.artima.com/intv/handcuffs.html http://www.mindview.net/Etc/Discussions/CheckedExceptions https://github.com/jOOQ/jOOL#orgjooqlambdaunchecked http://iteratrlearning.com/java9/2016/08/06/java9-streams.html http://www.javaslang.io/ http://www.scala-lang.org/