Nguyen Minh Kha TV

Embed Size (px)

DESCRIPTION

tieng việt

Citation preview

  • MT S TNH NNG MI TRONG JAVA SE 8

    1. Gii thiu Java 1.0 c gii thiu vo thng 1 nm 1996. T n nay ngnh cng ngh phn mm thay i, i hi Java cn phi i mi p ng c nhu cu ca s pht trin. Lnh vc thng mi ang i hi nhng h thng phn mm phc tp, v hu ht cc phn mm c thc thi trn h thng my tnh a nhn mnh m. S ra i ca my o Java (Java Virtual Machines JVM) vi trnh bin dch linh ng (Runtimes compilers), cho php lp trnh vin tp trung hon ton vo vic vit m lnh m khng cn quan tm n vic qun l, giao tip thit b phn cng v qun l cp pht b nh. Mt trong nhng vn kh khn trong lp trnh l lm th no xy dng ng dng c th hot ng hiu qu, khai thc ti a hiu nng ca h thng a x l. Nhng gii thut lp trnh song song thng d pht sinh li v tn nhiu thi gian. Java cung cp th vin java.util.concurrent v nhiu th vin khc c nh pht trin cung cp nhm gip lp trnh vin xy dng chng trnh hot ng tt trn h thng a x l. Nhng tt c cc th vin trn cn mt s hn ch nht nh. Mt hn ch v mt ngn ng trong cc phin bn trc y l s gii hn ca mc tru tng ha(abstractions), iu ny gy kh khn cho cc nh pht trin th vin (librariey writers). Mt v d in hnh l Java khng h tr cc thao tc x l song song trn cc tp d liu ln. Tru tng ha l khi nim kh quen thuc vi lp trnh vin, y l mt c im quan trng ca phng php lp trnh hng i tng (object-oriented programming). Nhng trong phng php lp trnh hng i tng, hu ht khi nim tru tng ha m t qu trnh tru tng ha d liu. Trong khi phng php lp trnh hm (functional programming) tru tng ha c dng ni n qu trnh tru tng ha cc hot ng (behavior). Trong th gii thc c c tru tng ha d liu v tru tng ha hot ng, do trong khi xy dng ng dng chng ta cn thit p dng nhng u im ca hai phng php tru tng ha. cc phin bn trc y, Java cung cp cc lp khuyt danh (anonymous inner classes) dng ci t interface, xy dng cc lp ch c dng duy nht mt ln trong mt ng dng. Nh trong ng dng Swing hoc JavaFX vit m thc thi cho s kin mouse event ca JButton lp trnh vin phi ci t giao din ActionListener bng cch s dng lp khuyt danh. Cc lp khuyt danh lm cho m lnh tr nn dng di, phc tp, kh c v sa li. gii quyt cc vn trn, Java SE 8 c Oracle v cng ng lp trnh vin Java xy dng, chnh thc gii thiu vo ngy 18 thng 3 nm 2014 vi nhiu tnh nng ci tin. Nh pht trin hy vng phin bn Java SE 8 s to ra bc t ph trong lnh vc cng nh phn mm. Mt s tnh nng ni bt nh Lambda expressions, Engine Nashorn b my x l m JavaScript, Method References v Default Methods, Stream API, Data/Time API Trong bi vit ny ngi vit s gii thiu mt s ci tin ni bt trong Java SE 8 thng qua cc v d minh ha.

    2. Lambda Expressions Biu thc Lambda

  • Mt ci tin ng ch trong Java SE 8 l s ra i ca biu thc Lambda. Biu thc Lambda cung cp cch vit lnh r rng v chnh xc, c dng ci t cc giao din(interface) thng qua cc biu thc (expression). Lambda expressions gip n gin ha m ngun, lm cho chng trnh Java d c v bo tr t lm tng nng sut ca lp trnh vin. ng thi Lambda expression gip ci thin ng k vic s dng cc th vin Collection, vic s dng th vin ny tr nn d dng hn thng qua cc b lp (iterate), cc lung (Streams), b lc (filter) trch xut d liu t Collection. Ngoi ra, kh nng tnh ton song song c ci thin nhm nng cao hiu nng khi hot ng trn h thng a nhn (multicore). 2.1. Anonymous Inner Class Lp n danh Trc khi tm hiu chi tit v biu thc Lambda, hy xem xt gii php lp trnh c s dng rt ph bin trong Java, l cc lp n danh (anonymous inner classes). Cc lp n danh cung cp cho lp trnh vin mt cch thc ci t cc giao din n hm (Single Abstract Method - SAM). Mt v d in hnh, trong ng dng Swing hoc JavaFX vit m thc thi cho s kin mouse event ca Jbutton nh sau:

    JButton testButton = new JButton("Test Button"); testButton.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent ae){ System.out.println("Click Detected by Anon Class"); } });

    Gii php ny cho php lp trnh vin khng cn phi xy dng mt lp x l s kin (event-handling) ring bit cho tng s kin. S dng lp n danh gy kh hiu cho ngi c, c bit i vi ngi cha c kinh nghip vi Java. Gii php th hai, ngi lp trnh phi xy dng cc lp x l ring bit cho tng s kin, bng cch ci t giao din ActionListioner. Gii php ny c u im l gip m ngun d c, nhc im l m lnh kh di dnh cho vic ci t duy nht mt phng thc.

    2.2. Functional Interfaces Cc giao din hm M ngun nh ngha giao din ActionListener nh sau: package java.awt.event; import java.util.EventListener; public interface ActionListener extends EventListener { public void actionPerformed(ActionEvent e); }

  • Giao din ActionListener l mt v d v cc giao din n hm. Trong Java SE 8, mt giao din nh vy c gi l giao functional interface giao din hm ( cc phin bn Java trc y c bit n vi tn gi Single Abstract Method SAM). Ci t cc giao din hm thng qua vic nh ngha cc lp n danh l mt cch lm thng dng trong Java. Mt s giao din quan trng nh EventListener, Runnable v Comparator c s dng theo cch ny. T nhng hn ch ca vic s dng lp n danh thc y nh pht trin tm mt gii php thay th, chnh l biu thc Lambda. 2.3. C php ca biu thc Lambda Biu thc Lambda n gin ha m lnh, bng cch thay th nhiu dng lnh trong ci t lp n danh bng mt dng lnh duy nht. Chng ta bt u tm hiu c php ca biu thc Lambda. Biu thc Lambda gm ba phn:

    Argument List Arrow Token Body

    1 (int x, int y) -> x + y

    2 () -> 42

    3 (String s) -> {System.out.println(s);}

    Danh sch tham s c khai bo tng t nh khai bo trong phng thc. K hiu -> l phn bt buc. Phn thn c th l mt biu thc n hoc mt khi lnh. Nu l biu thc, phn thn c nh gi tr v tr v; nu l khi lnh, phn thn c thc thi nh trong mt phng thc, cu lnh return s tr quyn iu khin cho i tng gi hm (caller). Lnh break v continue khng c dng trc tip trong thn, nhng c th dng bn trong mt vng lp. Nu phn thn to ra gi tr, gi tr cn phi c tr v hoc buc phi nm ngoi l. Ta cng kho st ba biu thc trn. Biu thc u tin nhn vo hai tham s, l x v y, v dng biu thc tr v gi tr x+y. Biu thc th 2 khng c tham s v tr v gi tr l 42. Biu thc th ba nhn vo mt tham s s kiu string, s dng khi lnh in gi tr s v khng tr v gi tr. 2.4. Mt s ng dng biu thc Lambda 2.4.1. ng dng biu thc Lambda ci t giao din Runnable public class RunnableTest { public static void main(String[] args) { System.out.println("=== RunnableTest ==="); //Cch 1: S dng lp n danh Anonymous class Runnable r1 = new Runnable(){

  • @Override public void run(){ System.out.println("Hello world one!"); } }; //Cch 2: S dng biu thc Lambda Runnable r2 = () -> System.out.println("Hello world two!"); // Cho Thread r1, r2 thc thi r1.run(); r2.run(); }

    }

    Trong c hai trng hp trn, khng c tham s c truyn vo v cng khng c gi tr trar v. cch 2, giao din Runnable c ci t bng biu thc Lambda, s dng khi lnh, ta thy nm dng lnh cch 1 c thay th ch bng mt biu thc cch 2. 2.4.2. ng dng biu thc Lambda ci t giao din Comparator Trong Java, giao din Comparator c s dng sp xp cc tp d liu Collections. Trong v d di y, mt i tng ArrayList cha cc i tng Person c sp xp da vo surName. Lp Person c khai bo nh sau: public class Person {

    private String givenName; private String surName; private int age; private Gender gender; private String eMail; private String phone; private String address;

    } Trong on m sau y, Comparator c s dng thng qua hai cch: lp n danh v thng qua biu thc Lambda. public class ComparatorTest { public static void main(String[] args) { List personList = Person.createShortList(); //Cch 1: Sp xp s dng lp n danh Collections.sort(personList, new Comparator(){ public int compare(Person p1, Person p2){ return p1.getSurName().compareTo(p2.getSurName()); } });

  • //In Tt c cc i tng trong ArrayList System.out.println("=== Sorted Asc SurName ==="); for(Person p:personList){ p.printName(); } //Cch 2: S dng biu thc Lambda, sp xp tng dn System.out.println("=== Sorted Asc SurName ==="); Collections.sort(personList, (Person p1, Person p2) ->

    p1.getSurName().compareTo(p2.getSurName())); for(Person p:personList){ p.printName(); } //Cch 3: S dng biu thc Lambda, sp xp gim dn System.out.println("=== Sorted Desc SurName ==="); Collections.sort(personList, (p1, p2) ->

    p2.getSurName().compareTo(p1.getSurName())); for(Person p:personList){ p.printName(); } } } Trong cch 1, lp trnh vin cn phi xy dng mt lp n danh lm cho m ngun tr nn kh c v kh hiu. Trong cch 2, s dng biu thc Lambda l gip m ngun ngn hn v quan trng hn l tnh d c v d bo tr ca chng trnh. 2.4.3. ng dng biu thc Lambda ci t giao din ActionListener public class ListenerTest { public static void main(String[] args) { JButton testButton = new JButton("Test Button"); //Cch 1: S dng lp n danh testButton.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent ae){ System.out.println("Click Detected by Anon Class"); } }); //Cch 2: S dng biu thc Lambda testButton.addActionListener(e -> System.out.println("Click

    Detected by Lambda Listner"));

  • //X l giao din form JFrame frame = new JFrame("Listener Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(testButton, BorderLayout.CENTER); frame.pack(); frame.setVisible(true); } } Tng t nh trn, chng ta d dng nhn thy u im ca biu thc Lambda, gii php s dng biu thc Lambda gip m ngun trong sng v d hiu. Biu thc Lambda cn c th c truyn nh mt tham s. Ta c th s dng biu thc Lambda nh mt tham s trong cc trng hp sau: - Khai bo bin - Gn gi tr - Cu lnh return - Khi to mng - Tham s hm hoc hm khi to - Bn trong mt biu thc Lambda khc - Bn trong ton t iu kin ? biu thc 1: biu thc 2 - Biu thc p kiu. 3. Stream API Hu ht cc thay i v mt ngn ng trong Java SE 8 nhm h tr lp trnh vin vit m lnh tt hn. Cc th vin quan trng trong Java cng c nhng ci tin ng k, mt th vin mi trong Java SE 8 nhm h tr x l cc tp d liu (collections) mt cch hiu qu hn, o chnh l Streams API. Thng thng, x l mng hoc cc tp d liu (collection) ta cn s dng b lp (iterator) hoc vng lp. Trong Java SE 8, lp Stream cho php chng ta x l mng, tp d liu mt cch c ng, xc tch hn ng thi ci thin ng k v mt hiu nng. Streams cng c th dng biu thc Lambda v cc giao din hm. Stream c hai ch : tun t v song song. Trong ch tun t, ti mt thi im nht nh mi phn t trong stream c c v x l, sau n phn t k tip c x l. Trong ch song song, d liu c tch thnh nhiu phn on bng cch s dng Spliterator. Mi phn on d liu c x l c lp trn cc lung (thread) khc nhau.

    //Sequential int sum = intList.stream().reduce(0, Integer::sum);

  • //Parrelel int sum = intList.parallelStream().reduce(0, Integer::sum);

    S dng Streams x l cc tp d liu c hai u im chnh. u im u tin l gip m ngun tr nn trong sng v d c. Chng ta cng kho st hai v d s dng b lp iterator trch lc d liu t mt danh sch: Gii php tun t:

    ArrayList filteredPeople = new ArrayList(); Iterator iter = people.iterator(); while (iter.hasNext()){ Person p = iter.next(); if(p.getAge() > 21 && p.getWeight() > 100 && "Chris".equals(p.getName())){ filteredPeople.add(p); } }

    S dng gii php song song:

    List filterPeople = people.parallelStream() .filter((Person p) -> p.getAge() > 21 && p.getWeight() > 100 && "Chris".equals(p.getName())) .collect(Collectors.toList());

    S dng stream c th gii hn s dng lnh thng qua mt chui cc li gi hm lin tip. Mc d c ch ny c th gim khng gian, nhng trnh s dng chui cc li gi hm qu di lm cho m lnh tr nn kh hiu v kh sa li. u im th hai l s ci thin ng k v hiu nng. th di y so snh thi gian thc thi mt on m lnh dng trch lc d liu trong Arraylist, bng cch s dng b lc, stream song song v stream tun t. M lnh c thc thi trn h thng my tnh quad-core:

  • Trong ln kim tra ny, s dng stream song song cho thy s ci thin hiu nng ng k khi s lng phn t trong tp d liu trn 2000. Khi s lng phn t ln hn, tc x l nhanh hn ng k v c th ci thin hn na vi s phn t rt ln. Stream tun t c tc tng ng vi b lp tt c cc trng hp d liu. Stream song song khng nn dng vi cc trng hp x l tp d liu nh, v nh vy s lm lng ph v lm gim kh nng tnh ton song song ca h thng.

    4. Nashorn B my x l JavaScript Nashorn l mt b my x l JavaScript hiu qu c gii thiu trong Java SE 8. Nashorn c xy dng hon ton bng ngn ng Java. Nashorn cho php lp trnh vin c th s dng xen ln m Java v JavaScript mt cch linh ng v hiu qu. Bng cch cung cp b my x l JavaScript trong Java, Oracle cung cp cho nh pht trin ng dng c th tip cn d dng n tt c cc th mnh ca Java nh: cc th vin m rng, ti u m ngun, h tr ti a truyn thng mng. Qua Oracel mun thu ht s quan tm nhiu hn t cc nh pht trin ng dng trn cc nn tng khc. 4.1. S dng m JavaScript trong Java Java Scripting API c th c s dng thc thi m lnh JavaScript t bn trong mt lp Java. Hy xt mt chng trnh Java n gin nh sau:

    1. import javax.script.*; 2. ScriptEngineManager m = new ScriptEngineManager(); 3. ScriptEngine nashorn = m.getEngineByName("nashorn"); 4. try { 5. nashorn.eval("print('Hello, world')");

  • 6. } catch (ScriptException e) { 7. }

    Nashorn cng cho php Java c mt tp m lnh JavaScript v thc thi. V d dng lnh di y c th thay th cho dng lnh th 5 on m trn:

    1. nashorn.eval(new java.io.FileReader(TestScript.js));

    Vi nhng chc nng ny, ngi lp trnh c th s dng cc JavaScript framework hoc s dng m kim tra d liu trn hai pha client v server. ng thi m ra nhng kh nng mi, th v ca phng php lp trnh a lung.

    4.2. S dng i tng Java trong JavaScript Trong Nashorn, mt i tng Java ton cc, c nh ngha trc. i tng ny h tr cc chc nng lm vic vi cc Java class bn trong m lnh JavaScript. V d, hy xem xt mt lp Java n gin gm mt hm khi to v mt phng thc getMessage nh sau:

    1. package com.Java8.example; 2. public class HelloUser { 3. private String name; 4. public HelloUser(String name) { 5. this.name = name; 6. } 7. public String getMessage() { 8. return "Hello, " + this.name; 9. } 10. }

    i tng Java c s dng import lp HelloUser vo m lnh JavaScript nh sau:

    1. var HelloUser = Java.type("com.Java8.example.HelloUser");

    V ta c th to mt i tng HelloUser v gi hm .getMessage() nh sau:

    1. var helloUser = new HelloUser("John"); 2. print(helloUser.getMessage())

    M lnh JavaScript c th c th thi bng cch s dng cng c jjs trong b JDK 8, nh sau:

    1. jjs -cp /com/Java8/example/HelloUser TestNashorn.js

    5. Kt lun

  • Java SE 8 c gii thiu vi nhiu tnh nng ni bt nhm h tr tt hn cho cc nh pht trin ng dng. Bng cch ti u ha m lnh, ci tin cc th vin lp trnh, h tr x l song song tt hn Vi Java SE 8, Oracle mun to ra mt bc t ph, nng cp cc chc nng ca ngn ng Java, nhm tch hp tt hn vi cc h thng phn cng khc nhau, ng thi tng tnh cnh tranh vi cc nn tng khc. Oracle mun cng c v th ca Java lun l nn tng pht trin ng dng c s dng rng ri nht.

    6. Ti liu tham kho [1]. Richard, 2014, WarburtonJava 8 Lambdas, Nh xut bn OReilly Media [2]. Oracle Documents, docs.oracle.com/javase/ [3]. Oracle Tutorials, docs.oracle.com/javase/tutorial/