Evolving with Java - How to Remain
Relevant & Effective
Naresha K, Technical Excellence Coach | Consultant |
Agile & Cloud Transformation Catalyst
@naresha_k
https://blog.nareshak.com/
Business
Time to Market |
Speed of Delivery
Economy
About Me
http://nareshak.blogspot.com/
http://nareshak.blogspot.com/
Relevant?
Effective?
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);
List<Integer> result = numbers.stream()
.map(ParallelStreams::computeHeavyArithmetic)
.collect(Collectors.toList());
System.out.println(result);
}
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);
List<Integer> result = numbers.parallelStream()
.map(ParallelStreams::computeHeavyArithmetic)
.collect(Collectors.toList());
System.out.println(result);
}
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);
List<Integer> result = numbers.stream()
.map(ParallelStreams::computeHeavyArithmetic)
.collect(Collectors.toList());
System.out.println(result);
}
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);
List<Integer> result = numbers.parallelStream()
.map(ParallelStreams::computeHeavyArithmetic)
.collect(Collectors.toList());
System.out.println(result);
}
private static Logger LOGGER =
LoggerFactory
.getLogger(MyClass.class);
All
models are wrong,
but some are useful.
George Box
https://en.wikipedia.org/wiki/All_models_are_wrong
Pain!
Suffering
Pain!
 Pain is the hammer of the gods to break
A dead resistance in the mortal’s heart
https://dhavaldalal.wordpress.com/2006/08/02/pain-and-suffering/
public static String concatWithPlus(String[]
values) {
String result = "";
for (int i = 0; i < values.length; i++) {
result += values[i];
}
return result;
}
public static String
concatWithStringBuffer(String[] values) {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < values.length; i++) {
buffer.append(values[i]);
}
return buffer.toString();
}
Java 1.4
Java 5
Maintainability?
‘+’ vs StringBuffer
Level of Abstraction
API Contract
Concatenation Concatenation
Thread Safety
Favour higher level
of abstraction
Premature
optimisation is the
root of all evil
~ Donald Knuth
Rule 1: Don’t
Rule 2: Don’t, yet
Rule 3: Profile before
optimising
http://wiki.c2.com/?RulesOfOptimization
YAGNI
http://wiki.c2.com/?MakeItWorkMakeItRightMakeItFast
Make it work
Make it Right
Make it Fast
http://wiki.c2.com/?MakeItWorkMakeItRightMakeItFast
Red Green
Refactor
TDD
Java 11
public static void main(String[] args) {
List numbers = Arrays.asList(1, 2, 3, 4, 5);
Iterator iterator = numbers.iterator();
while (iterator.hasNext()) {
Number number =
(Number) iterator.next();
System.out.println(number);
}
}
Java 1.4
public static void main(String[] args) {
List numbers = Arrays.asList(1, 2, 3, 4, 5);
Iterator iterator = numbers.iterator();
while (iterator.hasNext()) {
Number number =
(Number) iterator.next();
System.out.println(number);
}
} List<Number> numbers =
Arrays.asList(1, 2, 3, 4, 5);
for(Number number : numbers) {
System.out.println(number);
}
Java 1.4
Java 5
Syntactic Sugar
Minimise Moving Parts
Imperative -> Declarative
Fail fast
Runtime -> Compile time
/**
*
* @param customer
* @return This method returns orders
* of customer
*/
public List getOrdersOfCustomer(Customer
customer);
/**
* This method returns orders of customer
* @param customer Customer whose orders to be fetched
* @return List containing Order objects of the
* specified Customer
*/
public List getOrdersOfCustomer(Customer customer);
public List<Order>
getOrdersOfCustomer(Customer customer);
public List<OrderSummary>
getOrdersOfCustomer(Customer customer);
Self Documenting Code
DRY Principle
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);
int sumOfSquaresOfEvenNumbers = 0;
for (Integer number : numbers) {
if(number % 2 == 0) {
sumOfSquaresOfEvenNumbers += number * number;
}
}
System.out.println(sumOfSquaresOfEvenNumbers);
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);
int sumOfSquaresOfEvenNumbers = 0;
for (Integer number : numbers) {
if(number % 2 == 0) {
sumOfSquaresOfEvenNumbers += number * number;
}
}
System.out.println(sumOfSquaresOfEvenNumbers);
Predicate<Integer> isEven = (number) -> number % 2 == 0;
Function<Integer, Integer> square = (number) -> number *
number;
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);
Integer sum = numbers.stream()
.filter(isEven)
.map(square)
.collect(Collectors.
summingInt(Integer::intValue));
System.out.println(sum);
Java 8
Declarative Code
Smaller Units
Improved Readability
Easy to Modify
Are you confident enough to
refactor?
Tests give courage
Predicate<Integer> isEven = (number) -> number % 2 == 0;
Function<Integer, Integer> square = (number) ->
number * number;
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);
Integer result = numbers.stream()
.filter(isEven)
.map(square)
.findFirst().orElse(-1);
System.out.println(result);
Java 8
Predicate<Integer> isEven = (number) -> number % 2 == 0;
Function<Integer, Integer> square = (number) ->
number * number;
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);
Integer result = numbers.stream()
.filter(isEven)
.map(square)
.findFirst().orElse(-1);
System.out.println(result);
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);
int suqareOfFirstEvenNumber = -1;
for (Integer number : numbers) {
if(number % 2 == 0) {
suqareOfFirstEvenNumber += number * number;
break;
}
}
System.out.println(suqareOfFirstEvenNumber);
Java 8
What you see is not what
you get
Lazy Evaluation
Understand one level
below the abstraction
you deal with
Food pizza = new Pizza();
Person friend = new Person("Ravi");
friend.getMouth().setFood(pizza);
Food pizza = new Pizza();
Person friend = new Person("Ravi");
friend.getMouth().setFood(pizza);
Person friend = new Person("Ravi");
Edible food = new Pizza();
friend.offer(food);
Encapsulation
public static String readTemplate(String path) {
Path templatePath = Paths.get(path);
BufferedReader bufferedReader =
Files.newBufferedReader(templatePath);
// read from bufferedReader
return "";
}
public static String readTemplate(String path) {
Path templatePath = Paths.get(path);
try {
BufferedReader bufferedReader =
Files.newBufferedReader(templatePath);
} catch (IOException e) {
e.printStackTrace();
}
// read from bufferedReader
return "";
}
Use checked exceptions
Judiciously
Most people talk about Java the language, and this
may sound odd coming from me, but I could hardly
care less. At the core of the Java ecosystem is the
JVM.
- James Gosling,
Creator of the Java Programming Language(2011, TheServerSide)
http://zeroturnaround.com/rebellabs/the-adventurous-developers-guide-to-jvm-languages-java-scala-groovy-
fantom-clojure-ceylon-kotlin-xtend/
https://www.tiobe.com/tiobe-index/
https://www.jetbrains.com/research/devecosystem-2018/
https://www.jetbrains.com/research/devecosystem-2018/
package com.nareshak.demo
data class Person(val firstName: String, val
lastName: String)
package com.nareshak.demo;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Person {
private String firstName;
private String lastName;
}
package com.nareshak.demo;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Person {
private String firstName;
private String lastName;
}
package com.nareshak.demo;
import lombok.Data;
@Data
public class Person {
private String firstName;
private String lastName;
}
Overcoming the paradigm
inertia
Move beyond Syntax
Feel the pain and act upon it
I have not experienced the
pain, yet.
JPMS - Java Modules
Automatic Resource
Management
Thank You

Evolving with Java - How to remain Relevant and Effective