Professional Documents
Culture Documents
Nguyen Minh Kha TV
Nguyen Minh Kha TV
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
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);
}
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();
}
}
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
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);
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. }
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