SlideShare a Scribd company logo
1
Java 14 Pattern Matching
Oleksandr Navka
Lead Software Engineer, Consultant, GlobalLogic
2
1. Updated instanceof
2. Updated switch-case
3. Java Records
Agenda
3
Тагир Валеев
JetBrains
Pattern matching
и его воображаемые друзья
4
5
When someone match something :)
What is pattern matching?
6
Any pattern
• _
Constant pattern
• 1
• true
• null
Type pattern
• String s
Var pattern
• var i = 1
Deconstruction pattern
• Optional(String s)
• Node(Node left, Node right)
What are the patterns?
7
Instanceof
8
public class Animal {
}
class Dog extends Animal {
public void bark() {
}
}
class Cat extends Animal {
public void meow() {
}
}
9
public static void say(Animal animal) {
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
dog.bark();
} else if (animal instanceof Cat) {
Cat cat = (Cat) animal;
cat.meow();
}
}
10
public static void say(Animal animal) {
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
dog.bark();
} else if (animal instanceof Cat) {
Cat cat = (Cat) animal;
cat.meow();
}
}
11
public static void say(Animal animal) {
if (animal instanceof Dog dog) {
dog.bark();
} else if (animal instanceof Cat cat) {
cat.meow();
}
}
12
public static void say(Animal animal) {
if (animal instanceof Dog dog) {
dog.bark();
} else if (animal instanceof Cat cat) {
cat.meow();
}
}
13
Before:
expression istanceof Type
Now:
expression instanceof Pattern
14
Scoping
15
if (obj instanceof String s) {
// can use s here
} else {
// can't use s here
}
16
if (obj instanceof String s) {
// can use s here
} else {
// can't use s here
}
binding variable
17
if (!(obj instanceof String s)) {
} else {
s.contains("a")
}
18
if(obj instanceof String s && s.length() > 5) {
System.out.println(s.toUpperCase());
}
19
if(obj instanceof String s || s.length() > 5) {
System.out.println(s.toUpperCase());
}
20
if(!(obj instanceof String s) || s.length() > 5) {
System.out.println("Do something");
} else {
System.out.println(s.toUpperCase());
}
21
if(!(obj instanceof String s) || s.length() > 5) {
System.out.println("Do something");
} else {
System.out.println(s.toUpperCase());
}
22
if(!(obj instanceof String s) || s.length() > 5) {
throw new IllegalArgumentException();
}
System.out.println(s.toUpperCase());
23
if(!(obj instanceof String s) || s.length() > 5) {
throw new IllegalArgumentException();
}
System.out.println(s.toUpperCase());
24
if (!(obj instanceof String s)) {
s.contains(..)
} else {
s.contains(..)
}
25
private String s = "abc";
if (!(obj instanceof String s)) {
s.contains(..)
} else {
s.contains(..)
}
26
1. if (obj instanceof String s) {s.trim()}
2. if (!(obj instanceof String s)) {} else {s.contains("a")}
3. if(obj instanceof String s && s.length() > 5) {}
4. if(obj instanceof String s || s.length() > 5) {}
Binding variable scope
27
1. if (obj instanceof String s) {s.trim()}
2. if (!(obj instanceof String s)) {} else {s.contains("a")}
3. if(obj instanceof String s && s.length() > 5) {}
4. if(obj instanceof String s || s.length() > 5) {}
Binding variable scope
28
1. if (obj instanceof String s) {s.trim()}
2. if (!(obj instanceof String s)) {} else {s.contains("a")}
3. if(obj instanceof String s && s.length() > 5) {}
4. if(obj instanceof String s || s.length() > 5) {}
5. if(!(obj instanceof String s) || s.length() > 5) {}
6. if(!(obj instanceof String s) || s.length() > 5) {} else {s.toUpperCase());}
7. if(!(obj instanceof String s) || s.length() > 5) {
throw new IllegalArgumentException();
}
System.out.println(s.toUpperCase());
Binding variable scope
29
1. instanceof has got type pattern matching
2. instanceof the first java feature that got pattern matching
3. Be aware about scoping
Instanceof Summary
30
Switch - case
31
public enum ProgrammingParadigm {OBJECT_ORIENTED, PROCEDURAL, FUNCTIONAL}
public static List<String> getProgrammingLanguage(ProgrammingParadigm programmingParadigm) {
List<String> languages = new ArrayList<>();
switch (programmingParadigm) {
case OBJECT_ORIENTED:
languages.add("Java");
languages.add("C++");
break;
case FUNCTIONAL:
languages.add("Haskel");
break;
case PROCEDURAL:
languages.add("Pascal");
break;
}
return languages;
}
Old version of switch
32
public enum ProgrammingParadigm {OBJECT_ORIENTED, PROCEDURAL, FUNCTIONAL}
public static List<String> getProgrammingLanguage(ProgrammingParadigm programmingParadigm) {
List<String> languages = new ArrayList<>();
switch (programmingParadigm) {
case OBJECT_ORIENTED:
languages.add("Java");
languages.add("C++");
break;
case FUNCTIONAL:
languages.add("Haskel");
break;
case PROCEDURAL:
languages.add("Pascal");
break;
}
return languages;
}
Old version of switch
33
public enum ProgrammingParadigm {OBJECT_ORIENTED, PROCEDURAL, FUNCTIONAL}
public static List<String> getProgrammingLanguage(ProgrammingParadigm programmingParadigm) {
List<String> languages = new ArrayList<>();
switch (programmingParadigm) {
case OBJECT_ORIENTED:
languages.add("Java");
languages.add("C++");
break;
case FUNCTIONAL:
languages.add("Haskel");
break;
case PROCEDURAL:
languages.add("Pascal");
break;
}
return languages;
}
Old version of switch
Input type limitations:
byte, short, char, and int
Enum Types, String
34
public enum ProgrammingParadigm {OBJECT_ORIENTED, PROCEDURAL, FUNCTIONAL}
public static List<String> getProgrammingLanguage(ProgrammingParadigm programmingParadigm) {
List<String> languages = new ArrayList<>();
switch (programmingParadigm) {
case OBJECT_ORIENTED:
languages.add("Java");
languages.add("C++");
break;
case FUNCTIONAL:
languages.add("Haskel");
break;
case PROCEDURAL:
languages.add("Pascal");
break;
}
return languages;
}
Old version of switch
Can’t
get
result
35
public static List<String> getProgrammingLanguage(ProgrammingParadigm programmingParadigm) {
switch (programmingParadigm) {
case OBJECT_ORIENTED:
return List.of("Java", "C++");
case FUNCTIONAL:
return List.of("Haskel");
case PROCEDURAL:
return List.of("Pascal");
default:
return List.of();
}
}
36
public static List<String> getProgrammingLanguage(ProgrammingParadigm programmingParadigm) {
switch (programmingParadigm) {
case OBJECT_ORIENTED:
return List.of("Java", "C++");
case FUNCTIONAL:
return List.of("Haskel");
case PROCEDURAL:
return List.of("Pascal");
default:
return List.of();
}
}
37
Disadvantages:
1. Always remember about break
2. Input data type limitation
3. Can’t get result
4. Don’t understand all possible options for enum
Old version of switch
38
Pattern matching with switch case
39
public void printObject(Object obj) {
switch (obj) {
case String s:
System.out.println("This is String" + s.trim());
break;
case Integer i:
System.out.println("This is Integer" + i);
break;
case Number n:
System.out.println("This is number"+ n);
break;
default:
System.out.println("I don't know");
}
}
40
public void printObject(Object obj) {
switch (obj) {
case String s:
System.out.println("This is String" + s.trim());
break;
case Number n:
System.out.println("This is number"+ n);
break;
case Integer i:
System.out.println("This is Integer" + i);
break;
default:
System.out.println("I don't know");
}
}
41
public void printObject(Object obj) {
switch (obj) {
case String s:
System.out.println("This is String" + s.trim());
break;
default:
System.out.println("I don't know");
case Number n:
System.out.println("This is number"+ n);
break;
case Integer i:
System.out.println("This is Integer" + i);
break;
}
}
42
Updated switch case
43
public static List<String> getProgrammingLanguage(ProgrammingParadigm programmingParadigm) {
return switch (programmingParadigm) {
case OBJECT_ORIENTED -> List.of("Java", "C++");
case FUNCTIONAL -> List.of("Haskel");
case PROCEDURAL -> List.of("Pascal");
};
}
Updated switch case
44
public static List<String> getProgrammingLanguage(ProgrammingParadigm programmingParadigm) {
return switch (programmingParadigm) {
case OBJECT_ORIENTED -> {
System.out.println("You are master of polymorphism");
yield List.of("Java", "C++");
}
case FUNCTIONAL -> {
System.out.println("You are master of recursion");
yield List.of("Haskel");
}
case PROCEDURAL -> {
System.out.println("Try to use another paradigms");
yield List.of("Pascal");
}
};
}
45
1. Don’t need to use break
2. Can return result
3. Don’t need to use default branch if all options described
4. Input data types have limitations
Summary of updated switch
46
Java Records
47
private record Car(int speed, String manufacturer) {
}
Java Records
48
private record Car(int speed, String manufacturer) {
}
public static void main(String[] args) {
Car car = new Car(100, "Mercedes");
System.out.println(car.speed());
System.out.println(car.manufacturer());
}
Java Records
49
private record Car(int speed, String manufacturer) {
}
public static void main(String[] args) {
Car car = new Car(100, "Mercedes");
System.out.println(car);
}
-------
Output:
Car[speed=100, manufacturer=Mercedes]
Java Records
50
private static final class Car extends java.lang.Record {
private final int speed;
private final java.lang.String manufacturer;
public Car(int speed, java.lang.String manufacturer) { /* compiled code */ }
public java.lang.String toString() { /* compiled code */ }
public final int hashCode() { /* compiled code */ }
public final boolean equals(java.lang.Object o) { /* compiled code */ }
public int speed() { /* compiled code */ }
public java.lang.String manufacturer() { /* compiled code */ }
}
51
private static final class Car extends java.lang.Record {
private final int speed;
private final java.lang.String manufacturer;
public Car(int speed, java.lang.String manufacturer) { /* compiled code */ }
public java.lang.String toString() { /* compiled code */ }
public final int hashCode() { /* compiled code */ }
public final boolean equals(java.lang.Object o) { /* compiled code */ }
public int speed() { /* compiled code */ }
public java.lang.String manufacturer() { /* compiled code */ }
}
52
public abstract class Record {
protected Record() {}
@Override
public abstract boolean equals(Object obj);
@Override
public abstract int hashCode();
@Override
public abstract String toString();
}
53
private static final class Car extends java.lang.Record {
private final int speed;
private final java.lang.String manufacturer;
public Car(int speed, java.lang.String manufacturer) { /* compiled code */ }
public java.lang.String toString() { /* compiled code */ }
public final int hashCode() { /* compiled code */ }
public final boolean equals(java.lang.Object o) { /* compiled code */ }
public int speed() { /* compiled code */ }
public java.lang.String manufacturer() { /* compiled code */ }
}
54
private static final class Car extends java.lang.Record {
private final int speed;
private final java.lang.String manufacturer;
public Car(int speed, java.lang.String manufacturer) { /* compiled code */ }
public java.lang.String toString() { /* compiled code */ }
public final int hashCode() { /* compiled code */ }
public final boolean equals(java.lang.Object o) { /* compiled code */ }
public int speed() { /* compiled code */ }
public java.lang.String manufacturer() { /* compiled code */ }
}
55
private record Car(int speed, String manufacturer) {
public Car {
if(speed < 0) {
throw new IllegalArgumentException();
}
}
}
public static void main(String[] args) {
var car = new Car(-2, "Mercedes");
System.out.println(car);
}
Canonical constructor
56
private record Car(int speed, String manufacturer) {
public Car {
if(speed < 0) {
throw new IllegalArgumentException();
}
}
public Car(String manufacturer) {
this(0, manufacturer);
}
}
Canonical constructor
57
private static final class Car extends java.lang.Record {
private final int speed;
private final java.lang.String manufacturer;
public Car(int speed, java.lang.String manufacturer) { /* compiled code */ }
public java.lang.String toString() { /* compiled code */ }
public final int hashCode() { /* compiled code */ }
public final boolean equals(java.lang.Object o) { /* compiled code */ }
public int speed() { /* compiled code */ }
public java.lang.String manufacturer() { /* compiled code */ }
}
58
private static final class Car extends java.lang.Record {
private final int speed;
private final java.lang.String manufacturer;
public Car(int speed, java.lang.String manufacturer) { /* compiled code */ }
public java.lang.String toString() { /* compiled code */ }
public final int hashCode() { /* compiled code */ }
public final boolean equals(java.lang.Object o) { /* compiled code */ }
public int speed() { /* compiled code */ }
public java.lang.String manufacturer() { /* compiled code */ }
}
59
1. Java 14 present first version of pattern matching
2. Type pattern matching present in instanceof operator
3. New Switch statement was released with some blanks for
pattern matching
4. Keep eye on Java Records and deconstruction patterns
Summary
60
Thank You

More Related Content

PDF
Java Class Design
PDF
Concurrency Concepts in Java
PDF
The... Wonderful? World of Lambdas
PDF
What can be done with Java, but should better be done with Erlang (@pavlobaron)
PPTX
Clone Refactoring with Lambda Expressions
PDF
JVM Mechanics
PPTX
Java Language fundamental
PDF
Functional Programming in Java 8 - Exploiting Lambdas
Java Class Design
Concurrency Concepts in Java
The... Wonderful? World of Lambdas
What can be done with Java, but should better be done with Erlang (@pavlobaron)
Clone Refactoring with Lambda Expressions
JVM Mechanics
Java Language fundamental
Functional Programming in Java 8 - Exploiting Lambdas

What's hot (19)

PDF
Advanced Debugging Using Java Bytecodes
PDF
Java 8 Lambda Expressions
PDF
Clojure for Java developers - Stockholm
PDF
Comparing JVM languages
PPTX
02 Java Language And OOP Part II LAB
PDF
Beauty and the beast - Haskell on JVM
PDF
Java Concurrency by Example
PDF
Sailing with Java 8 Streams
PPTX
02 Java Language And OOP PART II
PDF
Java Generics - by Example
PDF
Kotlin Bytecode Generation and Runtime Performance
PDF
Java Keeps Throttling Up!
PPT
Strings and Characters
PDF
OCP Java SE 8 Exam - Sample Questions - Lambda Expressions
PDF
Design Patterns - Compiler Case Study - Hands-on Examples
PDF
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
PDF
JavaOne 2013 - Clojure for Java Developers
PPTX
Lambda выражения и Java 8
Advanced Debugging Using Java Bytecodes
Java 8 Lambda Expressions
Clojure for Java developers - Stockholm
Comparing JVM languages
02 Java Language And OOP Part II LAB
Beauty and the beast - Haskell on JVM
Java Concurrency by Example
Sailing with Java 8 Streams
02 Java Language And OOP PART II
Java Generics - by Example
Kotlin Bytecode Generation and Runtime Performance
Java Keeps Throttling Up!
Strings and Characters
OCP Java SE 8 Exam - Sample Questions - Lambda Expressions
Design Patterns - Compiler Case Study - Hands-on Examples
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
JavaOne 2013 - Clojure for Java Developers
Lambda выражения и Java 8
Ad

Similar to Pattern Matching in Java 14 (20)

PPTX
What is new in Java 8
PPTX
The Art of Java Type Patterns
PDF
Java 5 and 6 New Features
PDF
JavaOne 2016 - Learn Lambda and functional programming
PDF
Forgive me for i have allocated
PDF
Scala vs Java 8 in a Java 8 World
PDF
Scala - en bedre Java?
PPTX
Nice to meet Kotlin
PDF
Introduction to Pattern Matching in Java [Free Meetup]
PPTX
PPT
Scala in a nutshell by venkat
PDF
Scala - en bedre og mere effektiv Java?
PDF
Scala in Places API
PDF
Evolution and Examples of Java Features, from Java 1.7 to Java 22
PDF
The Future of JVM Languages
PDF
Not your father's tests
PPT
Introduzione al TDD
PPTX
Beyond java8
PDF
GTAC 2014: What lurks in test suites?
PDF
Scala @ TechMeetup Edinburgh
What is new in Java 8
The Art of Java Type Patterns
Java 5 and 6 New Features
JavaOne 2016 - Learn Lambda and functional programming
Forgive me for i have allocated
Scala vs Java 8 in a Java 8 World
Scala - en bedre Java?
Nice to meet Kotlin
Introduction to Pattern Matching in Java [Free Meetup]
Scala in a nutshell by venkat
Scala - en bedre og mere effektiv Java?
Scala in Places API
Evolution and Examples of Java Features, from Java 1.7 to Java 22
The Future of JVM Languages
Not your father's tests
Introduzione al TDD
Beyond java8
GTAC 2014: What lurks in test suites?
Scala @ TechMeetup Edinburgh
Ad

More from GlobalLogic Ukraine (20)

PDF
GlobalLogic JavaScript Community Webinar #21 “Інтерв’ю без заспокійливих”
PPTX
Deadlocks in SQL - Turning Fear Into Understanding (by Sergii Stets)
PDF
GlobalLogic Java Community Webinar #18 “How to Improve Web Application Perfor...
PDF
GlobalLogic Embedded Community x ROS Ukraine Webinar "Surgical Robots"
PDF
GlobalLogic Java Community Webinar #17 “SpringJDBC vs JDBC. Is Spring a Hero?”
PDF
GlobalLogic JavaScript Community Webinar #18 “Long Story Short: OSI Model”
PPTX
Штучний інтелект як допомога в навчанні, а не замінник.pptx
PPTX
Задачі AI-розробника як застосовується штучний інтелект.pptx
PPTX
Що треба вивчати, щоб стати розробником штучного інтелекту та нейромереж.pptx
PDF
GlobalLogic Java Community Webinar #16 “Zaloni’s Architecture for Data-Driven...
PDF
JavaScript Community Webinar #14 "Why Is Git Rebase?"
PDF
GlobalLogic .NET Community Webinar #3 "Exploring Serverless with Azure Functi...
PPTX
Страх і сила помилок - IT Inside від GlobalLogic Education
PDF
GlobalLogic .NET Webinar #2 “Azure RBAC and Managed Identity”
PDF
GlobalLogic QA Webinar “What does it take to become a Test Engineer”
PDF
“How to Secure Your Applications With a Keycloak?
PDF
GlobalLogic Machine Learning Webinar “Advanced Statistical Methods for Linear...
PPTX
GlobalLogic Machine Learning Webinar “Statistical learning of linear regressi...
PDF
GlobalLogic C++ Webinar “The Minimum Knowledge to Become a C++ Developer”
PDF
Embedded Webinar #17 "Low-level Network Testing in Embedded Devices Development"
GlobalLogic JavaScript Community Webinar #21 “Інтерв’ю без заспокійливих”
Deadlocks in SQL - Turning Fear Into Understanding (by Sergii Stets)
GlobalLogic Java Community Webinar #18 “How to Improve Web Application Perfor...
GlobalLogic Embedded Community x ROS Ukraine Webinar "Surgical Robots"
GlobalLogic Java Community Webinar #17 “SpringJDBC vs JDBC. Is Spring a Hero?”
GlobalLogic JavaScript Community Webinar #18 “Long Story Short: OSI Model”
Штучний інтелект як допомога в навчанні, а не замінник.pptx
Задачі AI-розробника як застосовується штучний інтелект.pptx
Що треба вивчати, щоб стати розробником штучного інтелекту та нейромереж.pptx
GlobalLogic Java Community Webinar #16 “Zaloni’s Architecture for Data-Driven...
JavaScript Community Webinar #14 "Why Is Git Rebase?"
GlobalLogic .NET Community Webinar #3 "Exploring Serverless with Azure Functi...
Страх і сила помилок - IT Inside від GlobalLogic Education
GlobalLogic .NET Webinar #2 “Azure RBAC and Managed Identity”
GlobalLogic QA Webinar “What does it take to become a Test Engineer”
“How to Secure Your Applications With a Keycloak?
GlobalLogic Machine Learning Webinar “Advanced Statistical Methods for Linear...
GlobalLogic Machine Learning Webinar “Statistical learning of linear regressi...
GlobalLogic C++ Webinar “The Minimum Knowledge to Become a C++ Developer”
Embedded Webinar #17 "Low-level Network Testing in Embedded Devices Development"

Recently uploaded (20)

PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PPTX
1. Introduction to Computer Programming.pptx
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PDF
Encapsulation_ Review paper, used for researhc scholars
PPTX
Spectroscopy.pptx food analysis technology
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPTX
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
PDF
Empathic Computing: Creating Shared Understanding
PPTX
Group 1 Presentation -Planning and Decision Making .pptx
PPTX
Tartificialntelligence_presentation.pptx
PPTX
TLE Review Electricity (Electricity).pptx
PDF
Machine learning based COVID-19 study performance prediction
PDF
Univ-Connecticut-ChatGPT-Presentaion.pdf
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPTX
OMC Textile Division Presentation 2021.pptx
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Agricultural_Statistics_at_a_Glance_2022_0.pdf
1. Introduction to Computer Programming.pptx
Assigned Numbers - 2025 - Bluetooth® Document
gpt5_lecture_notes_comprehensive_20250812015547.pdf
Encapsulation_ Review paper, used for researhc scholars
Spectroscopy.pptx food analysis technology
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Per capita expenditure prediction using model stacking based on satellite ima...
Advanced methodologies resolving dimensionality complications for autism neur...
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
Empathic Computing: Creating Shared Understanding
Group 1 Presentation -Planning and Decision Making .pptx
Tartificialntelligence_presentation.pptx
TLE Review Electricity (Electricity).pptx
Machine learning based COVID-19 study performance prediction
Univ-Connecticut-ChatGPT-Presentaion.pdf
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
OMC Textile Division Presentation 2021.pptx
Mobile App Security Testing_ A Comprehensive Guide.pdf

Pattern Matching in Java 14

  • 1. 1 Java 14 Pattern Matching Oleksandr Navka Lead Software Engineer, Consultant, GlobalLogic
  • 2. 2 1. Updated instanceof 2. Updated switch-case 3. Java Records Agenda
  • 3. 3 Тагир Валеев JetBrains Pattern matching и его воображаемые друзья
  • 4. 4
  • 5. 5 When someone match something :) What is pattern matching?
  • 6. 6 Any pattern • _ Constant pattern • 1 • true • null Type pattern • String s Var pattern • var i = 1 Deconstruction pattern • Optional(String s) • Node(Node left, Node right) What are the patterns?
  • 8. 8 public class Animal { } class Dog extends Animal { public void bark() { } } class Cat extends Animal { public void meow() { } }
  • 9. 9 public static void say(Animal animal) { if (animal instanceof Dog) { Dog dog = (Dog) animal; dog.bark(); } else if (animal instanceof Cat) { Cat cat = (Cat) animal; cat.meow(); } }
  • 10. 10 public static void say(Animal animal) { if (animal instanceof Dog) { Dog dog = (Dog) animal; dog.bark(); } else if (animal instanceof Cat) { Cat cat = (Cat) animal; cat.meow(); } }
  • 11. 11 public static void say(Animal animal) { if (animal instanceof Dog dog) { dog.bark(); } else if (animal instanceof Cat cat) { cat.meow(); } }
  • 12. 12 public static void say(Animal animal) { if (animal instanceof Dog dog) { dog.bark(); } else if (animal instanceof Cat cat) { cat.meow(); } }
  • 15. 15 if (obj instanceof String s) { // can use s here } else { // can't use s here }
  • 16. 16 if (obj instanceof String s) { // can use s here } else { // can't use s here } binding variable
  • 17. 17 if (!(obj instanceof String s)) { } else { s.contains("a") }
  • 18. 18 if(obj instanceof String s && s.length() > 5) { System.out.println(s.toUpperCase()); }
  • 19. 19 if(obj instanceof String s || s.length() > 5) { System.out.println(s.toUpperCase()); }
  • 20. 20 if(!(obj instanceof String s) || s.length() > 5) { System.out.println("Do something"); } else { System.out.println(s.toUpperCase()); }
  • 21. 21 if(!(obj instanceof String s) || s.length() > 5) { System.out.println("Do something"); } else { System.out.println(s.toUpperCase()); }
  • 22. 22 if(!(obj instanceof String s) || s.length() > 5) { throw new IllegalArgumentException(); } System.out.println(s.toUpperCase());
  • 23. 23 if(!(obj instanceof String s) || s.length() > 5) { throw new IllegalArgumentException(); } System.out.println(s.toUpperCase());
  • 24. 24 if (!(obj instanceof String s)) { s.contains(..) } else { s.contains(..) }
  • 25. 25 private String s = "abc"; if (!(obj instanceof String s)) { s.contains(..) } else { s.contains(..) }
  • 26. 26 1. if (obj instanceof String s) {s.trim()} 2. if (!(obj instanceof String s)) {} else {s.contains("a")} 3. if(obj instanceof String s && s.length() > 5) {} 4. if(obj instanceof String s || s.length() > 5) {} Binding variable scope
  • 27. 27 1. if (obj instanceof String s) {s.trim()} 2. if (!(obj instanceof String s)) {} else {s.contains("a")} 3. if(obj instanceof String s && s.length() > 5) {} 4. if(obj instanceof String s || s.length() > 5) {} Binding variable scope
  • 28. 28 1. if (obj instanceof String s) {s.trim()} 2. if (!(obj instanceof String s)) {} else {s.contains("a")} 3. if(obj instanceof String s && s.length() > 5) {} 4. if(obj instanceof String s || s.length() > 5) {} 5. if(!(obj instanceof String s) || s.length() > 5) {} 6. if(!(obj instanceof String s) || s.length() > 5) {} else {s.toUpperCase());} 7. if(!(obj instanceof String s) || s.length() > 5) { throw new IllegalArgumentException(); } System.out.println(s.toUpperCase()); Binding variable scope
  • 29. 29 1. instanceof has got type pattern matching 2. instanceof the first java feature that got pattern matching 3. Be aware about scoping Instanceof Summary
  • 31. 31 public enum ProgrammingParadigm {OBJECT_ORIENTED, PROCEDURAL, FUNCTIONAL} public static List<String> getProgrammingLanguage(ProgrammingParadigm programmingParadigm) { List<String> languages = new ArrayList<>(); switch (programmingParadigm) { case OBJECT_ORIENTED: languages.add("Java"); languages.add("C++"); break; case FUNCTIONAL: languages.add("Haskel"); break; case PROCEDURAL: languages.add("Pascal"); break; } return languages; } Old version of switch
  • 32. 32 public enum ProgrammingParadigm {OBJECT_ORIENTED, PROCEDURAL, FUNCTIONAL} public static List<String> getProgrammingLanguage(ProgrammingParadigm programmingParadigm) { List<String> languages = new ArrayList<>(); switch (programmingParadigm) { case OBJECT_ORIENTED: languages.add("Java"); languages.add("C++"); break; case FUNCTIONAL: languages.add("Haskel"); break; case PROCEDURAL: languages.add("Pascal"); break; } return languages; } Old version of switch
  • 33. 33 public enum ProgrammingParadigm {OBJECT_ORIENTED, PROCEDURAL, FUNCTIONAL} public static List<String> getProgrammingLanguage(ProgrammingParadigm programmingParadigm) { List<String> languages = new ArrayList<>(); switch (programmingParadigm) { case OBJECT_ORIENTED: languages.add("Java"); languages.add("C++"); break; case FUNCTIONAL: languages.add("Haskel"); break; case PROCEDURAL: languages.add("Pascal"); break; } return languages; } Old version of switch Input type limitations: byte, short, char, and int Enum Types, String
  • 34. 34 public enum ProgrammingParadigm {OBJECT_ORIENTED, PROCEDURAL, FUNCTIONAL} public static List<String> getProgrammingLanguage(ProgrammingParadigm programmingParadigm) { List<String> languages = new ArrayList<>(); switch (programmingParadigm) { case OBJECT_ORIENTED: languages.add("Java"); languages.add("C++"); break; case FUNCTIONAL: languages.add("Haskel"); break; case PROCEDURAL: languages.add("Pascal"); break; } return languages; } Old version of switch Can’t get result
  • 35. 35 public static List<String> getProgrammingLanguage(ProgrammingParadigm programmingParadigm) { switch (programmingParadigm) { case OBJECT_ORIENTED: return List.of("Java", "C++"); case FUNCTIONAL: return List.of("Haskel"); case PROCEDURAL: return List.of("Pascal"); default: return List.of(); } }
  • 36. 36 public static List<String> getProgrammingLanguage(ProgrammingParadigm programmingParadigm) { switch (programmingParadigm) { case OBJECT_ORIENTED: return List.of("Java", "C++"); case FUNCTIONAL: return List.of("Haskel"); case PROCEDURAL: return List.of("Pascal"); default: return List.of(); } }
  • 37. 37 Disadvantages: 1. Always remember about break 2. Input data type limitation 3. Can’t get result 4. Don’t understand all possible options for enum Old version of switch
  • 39. 39 public void printObject(Object obj) { switch (obj) { case String s: System.out.println("This is String" + s.trim()); break; case Integer i: System.out.println("This is Integer" + i); break; case Number n: System.out.println("This is number"+ n); break; default: System.out.println("I don't know"); } }
  • 40. 40 public void printObject(Object obj) { switch (obj) { case String s: System.out.println("This is String" + s.trim()); break; case Number n: System.out.println("This is number"+ n); break; case Integer i: System.out.println("This is Integer" + i); break; default: System.out.println("I don't know"); } }
  • 41. 41 public void printObject(Object obj) { switch (obj) { case String s: System.out.println("This is String" + s.trim()); break; default: System.out.println("I don't know"); case Number n: System.out.println("This is number"+ n); break; case Integer i: System.out.println("This is Integer" + i); break; } }
  • 43. 43 public static List<String> getProgrammingLanguage(ProgrammingParadigm programmingParadigm) { return switch (programmingParadigm) { case OBJECT_ORIENTED -> List.of("Java", "C++"); case FUNCTIONAL -> List.of("Haskel"); case PROCEDURAL -> List.of("Pascal"); }; } Updated switch case
  • 44. 44 public static List<String> getProgrammingLanguage(ProgrammingParadigm programmingParadigm) { return switch (programmingParadigm) { case OBJECT_ORIENTED -> { System.out.println("You are master of polymorphism"); yield List.of("Java", "C++"); } case FUNCTIONAL -> { System.out.println("You are master of recursion"); yield List.of("Haskel"); } case PROCEDURAL -> { System.out.println("Try to use another paradigms"); yield List.of("Pascal"); } }; }
  • 45. 45 1. Don’t need to use break 2. Can return result 3. Don’t need to use default branch if all options described 4. Input data types have limitations Summary of updated switch
  • 47. 47 private record Car(int speed, String manufacturer) { } Java Records
  • 48. 48 private record Car(int speed, String manufacturer) { } public static void main(String[] args) { Car car = new Car(100, "Mercedes"); System.out.println(car.speed()); System.out.println(car.manufacturer()); } Java Records
  • 49. 49 private record Car(int speed, String manufacturer) { } public static void main(String[] args) { Car car = new Car(100, "Mercedes"); System.out.println(car); } ------- Output: Car[speed=100, manufacturer=Mercedes] Java Records
  • 50. 50 private static final class Car extends java.lang.Record { private final int speed; private final java.lang.String manufacturer; public Car(int speed, java.lang.String manufacturer) { /* compiled code */ } public java.lang.String toString() { /* compiled code */ } public final int hashCode() { /* compiled code */ } public final boolean equals(java.lang.Object o) { /* compiled code */ } public int speed() { /* compiled code */ } public java.lang.String manufacturer() { /* compiled code */ } }
  • 51. 51 private static final class Car extends java.lang.Record { private final int speed; private final java.lang.String manufacturer; public Car(int speed, java.lang.String manufacturer) { /* compiled code */ } public java.lang.String toString() { /* compiled code */ } public final int hashCode() { /* compiled code */ } public final boolean equals(java.lang.Object o) { /* compiled code */ } public int speed() { /* compiled code */ } public java.lang.String manufacturer() { /* compiled code */ } }
  • 52. 52 public abstract class Record { protected Record() {} @Override public abstract boolean equals(Object obj); @Override public abstract int hashCode(); @Override public abstract String toString(); }
  • 53. 53 private static final class Car extends java.lang.Record { private final int speed; private final java.lang.String manufacturer; public Car(int speed, java.lang.String manufacturer) { /* compiled code */ } public java.lang.String toString() { /* compiled code */ } public final int hashCode() { /* compiled code */ } public final boolean equals(java.lang.Object o) { /* compiled code */ } public int speed() { /* compiled code */ } public java.lang.String manufacturer() { /* compiled code */ } }
  • 54. 54 private static final class Car extends java.lang.Record { private final int speed; private final java.lang.String manufacturer; public Car(int speed, java.lang.String manufacturer) { /* compiled code */ } public java.lang.String toString() { /* compiled code */ } public final int hashCode() { /* compiled code */ } public final boolean equals(java.lang.Object o) { /* compiled code */ } public int speed() { /* compiled code */ } public java.lang.String manufacturer() { /* compiled code */ } }
  • 55. 55 private record Car(int speed, String manufacturer) { public Car { if(speed < 0) { throw new IllegalArgumentException(); } } } public static void main(String[] args) { var car = new Car(-2, "Mercedes"); System.out.println(car); } Canonical constructor
  • 56. 56 private record Car(int speed, String manufacturer) { public Car { if(speed < 0) { throw new IllegalArgumentException(); } } public Car(String manufacturer) { this(0, manufacturer); } } Canonical constructor
  • 57. 57 private static final class Car extends java.lang.Record { private final int speed; private final java.lang.String manufacturer; public Car(int speed, java.lang.String manufacturer) { /* compiled code */ } public java.lang.String toString() { /* compiled code */ } public final int hashCode() { /* compiled code */ } public final boolean equals(java.lang.Object o) { /* compiled code */ } public int speed() { /* compiled code */ } public java.lang.String manufacturer() { /* compiled code */ } }
  • 58. 58 private static final class Car extends java.lang.Record { private final int speed; private final java.lang.String manufacturer; public Car(int speed, java.lang.String manufacturer) { /* compiled code */ } public java.lang.String toString() { /* compiled code */ } public final int hashCode() { /* compiled code */ } public final boolean equals(java.lang.Object o) { /* compiled code */ } public int speed() { /* compiled code */ } public java.lang.String manufacturer() { /* compiled code */ } }
  • 59. 59 1. Java 14 present first version of pattern matching 2. Type pattern matching present in instanceof operator 3. New Switch statement was released with some blanks for pattern matching 4. Keep eye on Java Records and deconstruction patterns Summary