A Java nyelv jdonsgai AK AKADMIA MARKOS ANDRS

  • Slides: 63
Download presentation
A Java nyelv újdonságai A&K AKADÉMIA MARKOS ANDRÁS HTTPS: //AK-AKADEMIA. HU

A Java nyelv újdonságai A&K AKADÉMIA MARKOS ANDRÁS HTTPS: //AK-AKADEMIA. HU

Bevezető 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA

Bevezető 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 2

Mi a Java? A Java egy ◦ ◦ ◦ platformfüggetlen általános célú objektumorientált osztályalapú

Mi a Java? A Java egy ◦ ◦ ◦ platformfüggetlen általános célú objektumorientált osztályalapú konkurens programozási nyelv. 1995 -től a Sun Microsystems fejlesztette 2009 -ben az Oracle felvásárolta (7, 4 milliárd $) 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 3

Java verziók Verzió JDK Alpha / Beta JDK 1. 0 JDK 1. 1. 7

Java verziók Verzió JDK Alpha / Beta JDK 1. 0 JDK 1. 1. 7 JDK 1. 1. 8 J 2 SE 1. 2. 1 J 2 SE 1. 2. 2 J 2 SE 1. 3. 1 J 2 SE 1. 4. 0 J 2 SE 1. 4. 1 J 2 SE 1. 4. 2 J 2 SE 5. 0 (1. 5. 0) Java SE 6 Java SE 7 Java SE 8 Java SE 9 Java SE 10 Java SE 11 2020. 11. 02. 19: 23 Kódnév Kiadási dátum 1995. 03. 23. Oak 1996. 01. 23. 1997. 02. 19. Brutus 1998. 09. 28. Chelsea 1999. 04. 08. Playground 1998. 12. 04. 1999. 03. 30. Cricket 1999. 07. 08. Kestrel 2000. 05. 08. Ladybird 2001. 05. 17. Merlin 2002. 13. Hopper 2002. 09. 16. Mantis 2003. 06. 26. Tiger 2004. 09. 29. Mustang 2006. 12. 11. Dolphin 2011. 07. Spider 2014. 03. 18. 2017. 09. 21. 2018. 03. 2018. 09. © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 4

Java népszerűsége 2018 áprilisi TIOBE index alapján Helyezés Programozási nyelv 1 Java 2 C

Java népszerűsége 2018 áprilisi TIOBE index alapján Helyezés Programozási nyelv 1 Java 2 C 3 C++ 4 Python 5 C# 6 Visual Basic. NET 7 PHP 8 Java. Script 9 SQL 10 Ruby 11 Delphi / Object Pascal 12 R 13 Visual Basic 14 Assembly language 15 Swift 16 Perl 17 MATLAB 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA Arány 15, 777% 13, 589% 7, 218% 5, 803% 5, 265% 4, 947% 4, 218% 3, 492% 2, 650% 2, 018% 1, 961% 1, 806% 1, 798% 1, 655% 1, 534% 1, 527% 1, 457% 5

Java működése Java forráskód (. java) javac fordító bájtkód (. class) 2020. 11. 02.

Java működése Java forráskód (. java) javac fordító bájtkód (. class) 2020. 11. 02. 19: 23 JVM JVM Windows Linux Macintosh © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 6

Rövidítések Rövidítés Angol kifejtés Magyar kifejtés JLS Java Language Specification Java nyelvi specifikáció JVM

Rövidítések Rövidítés Angol kifejtés Magyar kifejtés JLS Java Language Specification Java nyelvi specifikáció JVM Java Virtual Machine Java virtuális gép JRE Java Runtime Environment Java futtató környezet JDK Java Development Kit Java fejlesztői csomag Java ME (J 2 ME) Java Micro Edition - Java SE (J 2 SE) Java Standard Edition - Java EE (J 2 EE) Java Enterprise Edition - GC Garbage Collector szemétgyűjtő 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 7

Új nyelvi elemek áttekintése Verzió Új nyelvi elemek Java 10 • • párhuzamos teljes

Új nyelvi elemek áttekintése Verzió Új nyelvi elemek Java 10 • • párhuzamos teljes garbage collection a G 1 GC-hez var copy. Of Graal VM alternatív memóriaeszközök támogatása Docker észlelés gyorsabb JShell indulási idő 2018. 03. 20. Java 9 • • modul rendszer Collection factory metódusok JShell: Java REPL privát interfész metódusok 2017. 09. 21. Java 8 • • lambda kifejezések és funkcionális interfészek Stream API default és statikus metódusok interfészekben Date and Time API Collection API újítások core API újítások Optional 2014. 03. 18. 2020. 11. 02. 19: 23 Kiadási dátum © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 8

Új nyelvi elemek áttekintése Verzió Új nyelvi elemek Java 7 • • try-with-resources switch

Új nyelvi elemek áttekintése Verzió Új nyelvi elemek Java 7 • • try-with-resources switch Stringekre NIO. 2 aláhúzásjel szám literálokban 2011. 07. Java 6 • Collections Framework újítások • Console 2006. 12. 11. Java 5 • generics • enum • Executor Framework 2004. 09. 29. Java 11 • • • 2020. 11. 02. 19: 23 Kiadási dátum HTTP kliens Epsilon garbage collector var kiterjesztése lambda kifejezések paramétereire raw String literálok switch expressions © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 2018. 09. 9

Java 10

Java 10

Java 10 – Párhuzamos teljes garbage collection a G 1 GC-hez G 1 GC

Java 10 – Párhuzamos teljes garbage collection a G 1 GC-hez G 1 GC = Garbage First Garbage Collector Java 7 -ben vezették be kísérleti jelleggel. Hatékonyan, konkurensen nagy heap-eket is képes kitisztítani. Beállítható, hogy bizonyos várakozási időknél rövidebb legyen a stop-the-world helyzetekben a futási ideje. Java 9 óta ez az alapértelmezett GC. A G 1 GC-t többprocesszoros, sok memóriával rendelkező eszközökre tervezték. A G 1 GC: ◦ ◦ ◦ generációs inkrementális párhuzamos (többnyire) stop-the-world evakuáló 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 11

Java 10 – Párhuzamos teljes garbage collection a G 1 GC-hez Valós világbeli Java

Java 10 – Párhuzamos teljes garbage collection a G 1 GC-hez Valós világbeli Java alkalmazások megfigyelésével rájöttek, hogy ◦ az újonnan létrehozott objektumok 90%-a az első GC-t sem élik túl ◦ ha „néhány” GC-t túléltek, akkor 98% eséllyel továbbra is életben maradnak 1. Az újonnan létrehozott objektumok az Eden-be kerülnek. 2. Minor GC alkalmával átmásolódnak az egyik Survivor területre. 3. Ha több GC ciklust is túléltek, akkor az old generation-be kerülnek (Tenured). Heap Old generation Young generation Eden Survivor 1 Survivor 2 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 12

Java 10 – Párhuzamos teljes garbage collection a G 1 GC-hez A young generation

Java 10 – Párhuzamos teljes garbage collection a G 1 GC-hez A young generation esetén ◦ futási idejében hatékony GC algoritmussal tisztogat, ami ◦ gyors ◦ fele memóriát elpazarolja (Survivor 1 <-> Survivor 2 másolgatás) Az old generation esetén ◦ memória hatékony GC algoritmussal tisztogat, ami ◦ lassú ◦ memória hatékony Heap Old generation Young generation Eden Survivor 1 Survivor 2 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 13

new Array. List<>(); new Date(); new Hash. Map<>(); Heap Young generation Survivor 1 Old

new Array. List<>(); new Date(); new Hash. Map<>(); Heap Young generation Survivor 1 Old generation Eden Survivor 2 GC time! 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 14

new Array. List<>(); new Date(); new Hash. Map<>(); Heap Young generation Eden Survivor 1

new Array. List<>(); new Date(); new Hash. Map<>(); Heap Young generation Eden Survivor 1 1 Old generation 1 1 Survivor 2 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 15

new Array. List<>(); new Date(); new Hash. Map<>(); Heap Young generation Survivor 1 1

new Array. List<>(); new Date(); new Hash. Map<>(); Heap Young generation Survivor 1 1 Eden 1 1 Old generation 1 1 Survivor 2 GC time! 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 16

new Array. List<>(); new Date(); new Hash. Map<>(); Heap Young generation Survivor 1 Old

new Array. List<>(); new Date(); new Hash. Map<>(); Heap Young generation Survivor 1 Old generation Eden Survivor 2 2020. 11. 02. 19: 23 2 2 2 1 1 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 17

new Array. List<>(); new Date(); new Hash. Map<>(); Heap Young generation Survivor 1 Old

new Array. List<>(); new Date(); new Hash. Map<>(); Heap Young generation Survivor 1 Old generation Eden Survivor 2 GC time! 2020. 11. 02. 19: 23 2 2 2 1 1 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 18

new Array. List<>(); new Date(); new Hash. Map<>(); Heap Young generation Eden Survivor 1

new Array. List<>(); new Date(); new Hash. Map<>(); Heap Young generation Eden Survivor 1 1 1 3 2 Old generation 1 Survivor 2 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 19

new Array. List<>(); new Date(); new Hash. Map<>(); Heap Young generation Eden Survivor 1

new Array. List<>(); new Date(); new Hash. Map<>(); Heap Young generation Eden Survivor 1 1 1 3 2 Old generation 1 Survivor 2 GC time! 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 20

new Array. List<>(); new Date(); new Hash. Map<>(); Heap Young generation Survivor 1 Old

new Array. List<>(); new Date(); new Hash. Map<>(); Heap Young generation Survivor 1 Old generation 4 Eden Survivor 2 1 1 1 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 21

Java 10 – Párhuzamos teljes garbage collection a G 1 GC-hez A G 1

Java 10 – Párhuzamos teljes garbage collection a G 1 GC-hez A G 1 particionálja a heap-et azonos méretű régiókra (alapértelmezés szerint 2 MB egy régió). A régiók képzik a memóriafoglalás és felszabadítás egységét. A régiók mindegyike a következő állapotok egyikében lehet: ◦ üres (szürke) ◦ young generation ◦ eden (piros) ◦ survivor (piros S betűvel) ◦ old generation (világoskék) ◦ humongous (világoskék H betűvel) 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 22

Java 10 – Párhuzamos teljes garbage collection a G 1 GC-hez Régiók egy bizonyos

Java 10 – Párhuzamos teljes garbage collection a G 1 GC-hez Régiók egy bizonyos kis részét tisztogatja egyszerre, egy adott időzítés szerint. Eden régió esetén ha csak szeméttel volt tele, akkor üresnek jelöli meg ezt a területet, és nincs szükség további műveletekre => ez sokszor fordul elő, ezért gyors és innen kapta a nevét. Általános esetben egy régió tisztogatása után a túlélő objektumokat egy üres régióba másolja. Ha Eden régiót tisztogatott és vannak túlélő objektumok, akkor az üres régió, ahova másolja, survivor régiónak lesz minősítve. 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 23

Java 10 – Párhuzamos teljes garbage collection a G 1 GC-hez Előnyei: ◦ A

Java 10 – Párhuzamos teljes garbage collection a G 1 GC-hez Előnyei: ◦ A G 1 GC a munkája nagy részét konkurensen (az alkalmazás futása mellett) tudja elvégezni, ezért gyors. ◦ Nem egy nagy folytonos memóriaterületet használ, ezért nagyon nagy heap-eket is képes kezelni. ◦ A young és old generációkat egyszerre tudja begyűjteni. Hátránya: ◦ Kis heap esetén nem elég hatékony. ◦ Még mindig stop-the-world a teljes garbage collection esetén, párhuzamos (parallel) de nem konkurens (concurrent). Párhuzamos GC Konkurens GC Program szálai Szemétgyűjtő szálak futnak, normál futás során a program normál futása megállítva (stop-the-world) 2020. 11. 02. 19: 23 Program szálai normál futás során; konkurensen futó szemétgyűjtő szálak © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 24

Java 10 – var Csak helyi változóknál használható. Java típusossága nem sérül. Futásidőben nincs

Java 10 – var Csak helyi változóknál használható. Java típusossága nem sérül. Futásidőben nincs új nyelvi elem, a var kifejezések egyértelműen átfordulnak egy típusra. Ehelyett public static void main(String[] args) { List<Integer> my. List = new Array. List<>(); my. List. add(0451); my. List. add(42); } Írható ez: public static void main(String[] args) { var my. List = new Array. List<Integer>(); my. List. add(0451); my. List. add(42); } 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 25

Java 10 – var Ebből: public static void main(String[] args) { var my. List

Java 10 – var Ebből: public static void main(String[] args) { var my. List = new Array. List<Integer>(); my. List. add(0451); my. List. add(42); } Igazából ez lesz: public static void main(String[] args) { Array. List<Integer> my. List = new Array. List<Integer>(); my. List. add(0451); my. List. add(42); } 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 26

Java 10 – copy. Of import java. util. *; public class Copy. Of. Example

Java 10 – copy. Of import java. util. *; public class Copy. Of. Example { public static void main(String[] args) { List<Integer> my. List = new Array. List<>(); my. List. add(42); my. List. add(0451); List<Integer> copy. Of. My. List = List. copy. Of(my. List); Set<Integer> my. Set = new Hash. Set<>(); my. Set. add(4); my. Set. add(8); my. Set. add(15); my. Set. add(16); my. Set. add(23); my. Set. add(42); Set<Integer> copy. Of. My. Set = Set. copy. Of(my. Set); Map<String, String> my. Map = new Hash. Map<>(); my. Map. put("version", "10. 0"); my. Map. put("build_no", "135"); Map<String, String> copy. Of. My. Map = Map. copy. Of(my. Map); } } 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 27

Java 9/10 - Graal. VM A Graal. VM a JVM egy kiterjesztése, ami több

Java 9/10 - Graal. VM A Graal. VM a JVM egy kiterjesztése, ami több programozási nyelvet és több végrehajtási módot támogat. Új, nagy sebességű Java fordítót tartalmaz, ami szintén a Graal nevet kapta. just-in-time konfigurációban használható a Hot. Spot VM-en. ahead-of-time konfigurációban használható a Substrate. VM-en. 3 célja van a Graal projektnek: ◦ JVM alapú nyelvek teljesítményének növelése, hogy a natív nyelvekével egyenértékű legyen. ◦ Project Metropolis (Java-on-Java) a Hot. Spot kiterjedt C++ használatát helyettesítse. ◦ Más programozási nyelveket tetszőlegesen lehessen használni egyetlen programban => polyglot alkalmazások. 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 28

Java 10 – alternatív memóriaeszköz támogatás A Hot. Spot számára lehetővé tették, hogy az

Java 10 – alternatív memóriaeszköz támogatás A Hot. Spot számára lehetővé tették, hogy az object heap-et egy alternatív memóriaeszközön (pl. : NV-DIMM) foglalja le. Várhatóan a jövőben a számítógépek többféle típusú memóriamodult is tartalmazni fognak. 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 29

Java 10 – Docker észlelés Linux rendszeren futtatva a JVM tudja, hogy Docker konténerben

Java 10 – Docker észlelés Linux rendszeren futtatva a JVM tudja, hogy Docker konténerben fut-e. Konténerrel kapcsolatos információk ◦ a processzorok száma ◦ teljes, a konténer számára elérhető memória 3 új JVM lehetőség Docker konténert használók számára. Egyéb hibajavítások konténerizált környezetben futó Java alkalmazások esetén. 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 30

Java 10 – gyorsabb JShell indulási idő Bizonyos esetekben a Java 9 -ben bevezetett

Java 10 – gyorsabb JShell indulási idő Bizonyos esetekben a Java 9 -ben bevezetett JShell lassan indult, amit a Java 10 -ben orvosoltak. 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 31

Java 9

Java 9

Java 9 – Collection factory metódusok Egysoros inicializációt tesznek lehetővé. Immutábilis példányokat használnak. A

Java 9 – Collection factory metódusok Egysoros inicializációt tesznek lehetővé. Immutábilis példányokat használnak. A statikus factory metódus neve: of 10+ overloadolt változatot tartalmaz. Interfészbe kerültek (List, Set, Map) statikus metódusként. 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 33

Java 9 – Collection factory metódusok import java. util. List; import java. util. Map;

Java 9 – Collection factory metódusok import java. util. List; import java. util. Map; import java. util. Set; public class Collection. Factory. Method. Example { public static void main(String[] args) { List<Integer> my. List = List. of(4, 8, 15, 16, 23, 42); Set<Integer> my. Set = Set. of(4, 8, 15, 16, 23, 42); Map<String, String> my. Map = Map. of("version", "10", "build_no", "135"); System. out. println(my. List); System. out. println(my. Set); System. out. println(my. Map); } } 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 34

Interfészek Java 8 előtt public class String. Pair implements Pair<String> { public interface Pair<E>

Interfészek Java 8 előtt public class String. Pair implements Pair<String> { public interface Pair<E> { static <E> void swap. Elements(Pair<E> pair) { E old. Left. Element = pair. get. Left. Element(); pair. set. Left. Element(pair. get. Right. Element()); pair. set. Right. Element(old. Left. Element); } default void print. Elements() { System. out. println(get. Left. Element()); System. out. println(get. Right. Element()); } E get. Left. Element(); void set. Left. Element(E element); E get. Right. Element(); void set. Right. Element(E element); private String left. Element; private String right. Element; public String. Pair(String left. Element, String right. Element) { this. left. Element = left. Element; this. right. Element = right. Element; } public String get. Left. Element() { return left. Element; } public void set. Left. Element(String left. Element) { this. left. Element = left. Element; } public String get. Right. Element() { return right. Element; } public void set. Right. Element(String right. Element) { this. right. Element = right. Element; } } } 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 35

Interfészek Java 8 -ban public class String. Pair implements Pair<String> { public interface Pair<E>

Interfészek Java 8 -ban public class String. Pair implements Pair<String> { public interface Pair<E> { static <E> void swap. Elements(Pair<E> pair) { E old. Left. Element = pair. get. Left. Element(); pair. set. Left. Element(pair. get. Right. Element()); pair. set. Right. Element(old. Left. Element); } default void print. Elements() { System. out. println(get. Left. Element()); System. out. println(get. Right. Element()); } E get. Left. Element(); void set. Left. Element(E element); E get. Right. Element(); void set. Right. Element(E element); private String left. Element; private String right. Element; public String. Pair(String left. Element, String right. Element) { this. left. Element = left. Element; this. right. Element = right. Element; } public String get. Left. Element() { return left. Element; } public void set. Left. Element(String left. Element) { this. left. Element = left. Element; } public String get. Right. Element() { return right. Element; } public void set. Right. Element(String right. Element) { this. right. Element = right. Element; } } } 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 36

Interfészek Java 9 -ben public interface Pair<E> { public class String. Pair implements Pair<String>

Interfészek Java 9 -ben public interface Pair<E> { public class String. Pair implements Pair<String> { static <E> void swap. Elements(Pair<E> pair) { E old. Left. Element = pair. get. Left. Element(); pair. set. Left. Element(pair. get. Right. Element()); pair. set. Right. Element(old. Left. Element); } private String left. Element; private String right. Element; default void print. Elements() { print. Separator(); System. out. println(get. Left. Element()); System. out. println(get. Right. Element()); print. Separator(); } public String. Pair(String left. Element, String right. Element) { this. left. Element = left. Element; this. right. Element = right. Element; } public String get. Left. Element() { return left. Element; } private void print. Separator() { System. out. println("-----"); } public void set. Left. Element(String left. Element) { this. left. Element = left. Element; } E get. Left. Element(); public String get. Right. Element() { return right. Element; } void set. Left. Element(E element); E get. Right. Element(); public void set. Right. Element(String right. Element) { this. right. Element = right. Element; } void set. Right. Element(E element); } 2020. 11. 02. 19: 23 } © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 37

Java 9 – modul rendszer Project Jigsaw kódnéven futott Célja a Java platform modularizációja:

Java 9 – modul rendszer Project Jigsaw kódnéven futott Célja a Java platform modularizációja: 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 38

Java 9 – modul rendszer Egy speciálisan elnevezett fájlt igényel: module-info. java tartalma: module

Java 9 – modul rendszer Egy speciálisan elnevezett fájlt igényel: module-info. java tartalma: module ${module-name} { requires ${module-name}; exports ${package-name}; } A requires a függőségeket írja le. Az exports azokat a package-eket nevezi meg, amik elérhetők más modulból. 2020. 11. 02. 19: 23 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 39

Java 9 – JShell REPL = Read Evaluate Print Loop Parancssori eszköz. Azonnali visszajelzést

Java 9 – JShell REPL = Read Evaluate Print Loop Parancssori eszköz. Azonnali visszajelzést ad a megadott Java utasításokról. Kipróbálható vele bármilyen Java nyelvi elem. 2020. 11. 02. 19: 24 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 40

Java 9 – JShell C: Program FilesJavajdk-10bin>jshell | Welcome to JShell -- Version 10

Java 9 – JShell C: Program FilesJavajdk-10bin>jshell | Welcome to JShell -- Version 10 | For an introduction type: /help intro jshell> int i = 5 i ==> 5 jshell> int j = 6 j ==> 6 jshell> int k = i + j; k ==> 11 jshell> 2020. 11. 02. 19: 24 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 41

Java 8

Java 8

Java 8 – lambda kifejezések előtt import java. util. Array. List; java. util. Collections;

Java 8 – lambda kifejezések előtt import java. util. Array. List; java. util. Collections; java. util. Comparator; java. util. List; public class Sorting. With. Lambdas { public static void main(String[] args) { List<String> names = new Array. List<>(List. of("John", "Adam", "Victoria", "Aaron", "Robert", "Ursula", "Lauren", "Elisabeth", "Zeno")); Collections. sort(names, new Comparator<String>() { @Override public int compare(String first, String second) { return Integer. compare(first. length(), second. length()); } }); System. out. println(names); } } 2020. 11. 02. 19: 24 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 43

Java 8 – lambda kifejezések segítségével import java. util. Array. List; import java. util.

Java 8 – lambda kifejezések segítségével import java. util. Array. List; import java. util. Collections; import java. util. List; public class Sorting. With. Lambdas { public static void main(String[] args) { List<String> names = new Array. List<>(List. of("John", "Adam", "Victoria", "Aaron", "Robert", "Ursula", "Lauren", "Elisabeth", "Zeno")); Collections. sort(names, (first, second) -> Integer. compare(first. length(), second. length())); System. out. println(names); } } 2020. 11. 02. 19: 24 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 44

Java 8 – lambda kifejezések Névtelen metódusok. Paraméterként adható át vele logika. Java 8

Java 8 – lambda kifejezések Névtelen metódusok. Paraméterként adható át vele logika. Java 8 előtt is volt erre lehetőség. Egyik ok, ami létjogosultságot adott a névtelen belső osztályoknak. Lambda kifejezéssel tömörebb, mint névtelen belső osztállyal. Kevesebb a boilerplate kód. Új kapcsolódó szintaktikai elem : : Metódus referencia, definiált metódus átadható paraméterként. 2020. 11. 02. 19: 24 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 45

Java 8 – funkcionális interfész Minden olyan interfész, ami 1 absztrakt metódust tartalmaz. SAM

Java 8 – funkcionális interfész Minden olyan interfész, ami 1 absztrakt metódust tartalmaz. SAM = Single Abstract Method Opcionálisan ellátható az ilyen interfész a @Functional. Interface annotációval. @Override annotációval azonos szerep. Comparable Runnable Callable Action. Listener 2020. 11. 02. 19: 24 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 46

Java 8 – funkcionális interfészek Interface Bi. Consumer<T, U> Bi. Function<T, U, R> Binary.

Java 8 – funkcionális interfészek Interface Bi. Consumer<T, U> Bi. Function<T, U, R> Binary. Operator<T> Bi. Predicate<T, U> Boolean. Supplier Consumer<T> Double. Binary. Operator Double. Consumer Double. Function<R> Double. Predicate Double. Supplier Double. To. Int. Function Double. To. Long. Function Double. Unary. Operator Function<T, R> Int. Binary. Operator Int. Consumer Int. Function<R> Int. Predicate Int. Supplier Int. To. Double. Function Int. To. Long. Function Int. Unary. Operator Long. Binary. Operator Long. Consumer Long. Function<R> Long. Predicate Long. Supplier Long. To. Double. Function Long. To. Int. Function Long. Unary. Operator Obj. Double. Consumer<T> Obj. Int. Consumer<T> Obj. Long. Consumer<T> Predicate<T> Supplier<T> To. Double. Bi. Function<T, U> To. Double. Function<T> To. Int. Bi. Function<T, U> To. Int. Function<T> To. Long. Bi. Function<T, U> To. Long. Function<T> Unary. Operator<T> 2020. 11. 02. 19: 24 Description Represents an operation that accepts two input arguments and returns no result. Represents a function that accepts two arguments and produces a result. Represents an operation upon two operands of the same type, producing a result of the same type as the operands. Represents a predicate (boolean-valued function) of two arguments. Represents a supplier of boolean-valued results. Represents an operation that accepts a single input argument and returns no result. Represents an operation upon two double-valued operands and producing a double-valued result. Represents an operation that accepts a single double-valued argument and returns no result. Represents a function that accepts a double-valued argument and produces a result. Represents a predicate (boolean-valued function) of one double-valued argument. Represents a supplier of double-valued results. Represents a function that accepts a double-valued argument and produces an int-valued result. Represents a function that accepts a double-valued argument and produces a long-valued result. Represents an operation on a single double-valued operand that produces a double-valued result. Represents a function that accepts one argument and produces a result. Represents an operation upon two int-valued operands and producing an int-valued result. Represents an operation that accepts a single int-valued argument and returns no result. Represents a function that accepts an int-valued argument and produces a result. Represents a predicate (boolean-valued function) of one int-valued argument. Represents a supplier of int-valued results. Represents a function that accepts an int-valued argument and produces a double-valued result. Represents a function that accepts an int-valued argument and produces a long-valued result. Represents an operation on a single int-valued operand that produces an int-valued result. Represents an operation upon two long-valued operands and producing a long-valued result. Represents an operation that accepts a single long-valued argument and returns no result. Represents a function that accepts a long-valued argument and produces a result. Represents a predicate (boolean-valued function) of one long-valued argument. Represents a supplier of long-valued results. Represents a function that accepts a long-valued argument and produces a double-valued result. Represents a function that accepts a long-valued argument and produces an int-valued result. Represents an operation on a single long-valued operand that produces a long-valued result. Represents an operation that accepts an object-valued and a double-valued argument, and returns no result. Represents an operation that accepts an object-valued and a int-valued argument, and returns no result. Represents an operation that accepts an object-valued and a long-valued argument, and returns no result. Represents a predicate (boolean-valued function) of one argument. Represents a supplier of results. Represents a function that accepts two arguments and produces a double-valued result. Represents a function that accepts two arguments and produces an int-valued result. Represents a function that accepts two arguments and produces a long-valued result. Represents a function that produces a long-valued result. Represents an operation on a single operand that produces a result of the same type as its operand. © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 47

Java 8 – funkcionális interfészek @Functional. Interface public interface Consumer<T> { void accept(T t);

Java 8 – funkcionális interfészek @Functional. Interface public interface Consumer<T> { void accept(T t); } @Functional. Interface public interface Supplier<T> { T get(); } @Functional. Interface public interface Predicate<T> { boolean test(T t); } @Functional. Interface public interface Function<T, R> { R apply(T t); } @Functional. Interface public interface Bi. Function<T, U, R> { R apply(T t, U u); } 2020. 11. 02. 19: 24 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 48

Java 8 – Stream API nélkül import java. util. Array. List; import java. util.

Java 8 – Stream API nélkül import java. util. Array. List; import java. util. Iterator; import java. util. List; public class Before. Stream. APIExample { public static void main(String[] args) { List<String> names = new Array. List<>(List. of("John", "Adam", "Victoria", "Aaron", "Robert", "Ursula", "Lauren", "Elisabeth", "Zeno")); for (Iterator<String> iterator = names. iterator(); iterator. has. Next(); ) { String name = iterator. next(); String lower. Case. Name = name. to. Lower. Case(); if (lower. Case. Name. starts. With("a")) { iterator. remove(); continue; } System. out. println(lower. Case. Name); } } } 2020. 11. 02. 19: 24 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 49

Java 8 – Stream API segítségével import java. util. Array. List; import java. util.

Java 8 – Stream API segítségével import java. util. Array. List; import java. util. Iterator; import java. util. List; public class Stream. APIExample { public static void main(String[] args) { List<String> names = new Array. List<>(List. of("John", "Adam", "Victoria", "Aaron", "Robert", "Ursula", "Lauren", "Elisabeth", "Zeno")); names = names. stream() . map(name -> name. to. Lower. Case()) . filter(name -> !name. starts. With("a")) . collect(Collectors. to. List()); names. stream(). for. Each(System. out: : println); } } 2020. 11. 02. 19: 24 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 50

Java 8 – Date and Time API Sok probléma az eredeti osztályokkal (java. util.

Java 8 – Date and Time API Sok probléma az eredeti osztályokkal (java. util. Date, java. text. Simple. Date. Format): ◦ Megértést és használatot nehezítő tényezők ◦ Nem immutábilisak. ◦ Kontraintuitív: Date date = new Date(117, 1, 2); // kimenet: 2017 -02 -02 ◦ Időzónákat nem kezelik. ◦ Nem szálbiztosak. 2020. 11. 02. 19: 24 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 51

Java 8 – Date and Time API Local. Date -> dátum idő nélkül (1985

Java 8 – Date and Time API Local. Date -> dátum idő nélkül (1985 -10 -26) Local. Time -> idő dátum nélkül (01: 20: 00. 562748800) Local. Date. Time -> dátum idővel (1985 -10 -26 T 01: 20: 00. 562748800) 2020. 11. 02. 19: 24 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 52

Java 8 – Date and Time API import java. time. Local. Date; public class

Java 8 – Date and Time API import java. time. Local. Date; public class Date. Time. APIExample 1 { public static void main(String[] args) { Local. Date today = Local. Date. now(); System. out. println(today); // 1985 -10 -26 } } 2020. 11. 02. 19: 24 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 53

Java 8 – Date and Time API import java. time. Local. Time; public class

Java 8 – Date and Time API import java. time. Local. Time; public class Date. Time. APIExample 2 { public static void main(String[] args) { Local. Time now = Local. Time. now(); System. out. println(now); // 01: 20: 00. 562748800 } } 2020. 11. 02. 19: 24 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 54

Java 8 – Date and Time API import java. time. Local. Date. Time; public

Java 8 – Date and Time API import java. time. Local. Date. Time; public class Date. Time. APIExample 3 { public static void main(String[] args) { Local. Date. Time now = Local. Date. Time. now(); System. out. println(now); // 1985 -10 -26 T 01: 20: 00. 562748800 } } 2020. 11. 02. 19: 24 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 55

Java 8 – Date and Time API import java. time. Local. Date. Time; public

Java 8 – Date and Time API import java. time. Local. Date. Time; public class Date. Time. APIExample 4 { public static void main(String[] args) { Local. Date. Time present = Local. Date. Time. of(1985, 10, 26, 01, 20, 00); Local. Date. Time past = present. minus. Years(30); System. out. println(present); // 1985 -10 -26 T 01: 20 System. out. println(past); // 1955 -10 -26 T 01: 20 } } 2020. 11. 02. 19: 24 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 56

Java 8 – Optional Érték hiányának jelzésére használható => fluent API írható vele. null

Java 8 – Optional Érték hiányának jelzésére használható => fluent API írható vele. null használata nem szerencsés. Alapvetően visszatérési értékek esetén használjuk. Paraméterváltozó típusaként kerülendő => overloading. Osztály és példányváltozó típusaként kerülendő. Nem szerializálható. 2020. 11. 02. 19: 24 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 57

Java 8 – Optional<Coordinates> coordinates = get. GPSCoordinates(); coordinates. or. Else(Coordinates. NOT_AVAILABLE); 2020. 11.

Java 8 – Optional<Coordinates> coordinates = get. GPSCoordinates(); coordinates. or. Else(Coordinates. NOT_AVAILABLE); 2020. 11. 02. 19: 24 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 58

Java 7

Java 7

Java 7 – aláhúzásjel szám literálokban Szám literálok tagolására használható. Csak számjegyek közé helyezhető.

Java 7 – aláhúzásjel szám literálokban Szám literálok tagolására használható. Csak számjegyek közé helyezhető. Aláhúzásjel nem tehető: ◦ a szám legelejére és legvégére ◦ tizedesvessző mellé közvetlenül ◦ a literál típusát jelző végződés elé 2020. 11. 02. 19: 24 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 60

Java 7 – aláhúzásjel szám literálokban float pi 1 = 3_. 1415 F; //

Java 7 – aláhúzásjel szám literálokban float pi 1 = 3_. 1415 F; // Invalid; cannot put underscores adjacent to a decimal point float pi 2 = 3. _1415 F; // Invalid; cannot put underscores adjacent to a decimal point long social. Security. Number 1 = 999_99_9999_L; // Invalid; cannot put underscores prior to an L suffix int x 1 x 2 x 3 x 4 = = _52; 5_2; 52_; 5_______2; // // This is an identifier, not a numeric literal OK (decimal literal) Invalid; cannot put underscores at the end of a literal OK (decimal literal) int x 5 x 6 x 7 x 8 = = 0_x 52; 0 x_52; 0 x 5_2; 0 x 52_; // // Invalid; cannot OK (hexadecimal Invalid; cannot int x 9 = 0_52; int x 10 = 05_2; int x 11 = 052_; 2020. 11. 02. 19: 24 put underscores in the 0 x radix prefix put underscores at the beginning of a number literal) put underscores at the end of a number // OK (octal literal) // Invalid; cannot put underscores at the end of a number © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 61

Java 7 – switch String típussal import java. util. List; import java. util. Random;

Java 7 – switch String típussal import java. util. List; import java. util. Random; public class Switch. With. String { public static void main(String[] args) { List<String> results = List. of("Egyest dobtál", "Kettest dobtál" , "Hármast dobtál" , "Négyest dobtál" , "Ötöst dobtál", "Hatost dobtál"); int random. Index = new Random(). next. Int( results. size()); String result = results. get(random. Index); System. out. println(result); switch (result) { case "Egyest dobtál": System. out. println("A szerencse nem áll melletted. " ); break; case "Kettest dobtál" : System. out. println("Dobtál már jobbat is. " ); break; case "Hármast dobtál" : System. out. println("Nem is rossz. "); break; case "Négyest dobtál" : System. out. println("Ez jó lesz. "); break; case "Ötöst dobtál": System. out. println("Szépen haladsz előre. " ); break; case "Hatost dobtál": System. out. println("Szuper! Mégegyszer dobhatsz!" ); break; } } } 2020. 11. 02. 19: 24 © 2018 A&K AKADÉMIA – MINDEN JOG FENNTARTVA 62

https: //ak-akademia. hu Köszönöm a = figyelmet()

https: //ak-akademia. hu Köszönöm a = figyelmet()