You are on page 1of 10

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 (objectoriented 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

(int x, int y)

->

x + y

()

->

42

(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<Person> personList = Person.createShortList();
//Cch 1: Sp xp s dng lp n danh
Collections.sort(personList, new Comparator<Person>(){
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 <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<Person> filteredPeople = new ArrayList<Person>();
Iterator<Person> 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<Person> 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.
2.
3.
4.
5.

import javax.script.*;
ScriptEngineManager m = new ScriptEngineManager();
ScriptEngine nashorn = m.getEngineByName("nashorn");
try {
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/

You might also like