Tr ng Đi h c Bách Khoa Hà N iườ
Vi n CNTT-TT
L p trình Java.
Đ tài: Tìm hi u v Monadic Operations.
Thành viên: MSSV Giáo viên h ng d nướ
Đu Văn Th ng 20112678 Nguy n H ng Quang
Hà Nội, 8/9/2014
Page | 1
Contents
Page | 2
I. Lý thuyết.
3. PROGRAMING WITH LAMDAS.
3.10. Monadic Operations.
Khi làm vi c v i các lo i d li u t ng quát, và các hàm ph i đa ra các k t qu (v i ư ế
các ki u khác nhau), thì vi c áp d ng Monadic Operations giúp b n d dàng t o ra
nhi u hàm nh v y. Trong ph n này chúng ta s cùng nhau tìm hi u m u thi t k cho ư ế ế
Monadic Operations.
Gi s chúng ta có m t d li u t ng quát là G<T> v i m t tham s . Nó bao g m m t
s d li u c th h n nh : ơ ư
1. List<T>: Bao g m m t ho c nhi u giá tr lo i T.
2. Optional<T>: Không có giá tr ho c ch có m t giá tr lo i T.
3. Future<T>: Ph i có ít nh t m t giá tr lo i T trong danh sách.
Chúng ta cũng gi s có m t function T U ho c coi nh m t đi t ng ư ượ
Function< T,U >.
Thông th ng thì chúng ta s ph i làm vi c v i các d li u G<T> (d li u t ng quát)ườ
thay vì làm vi c v i các d li u c th h n nh List<T>, Optional<T> hay Future<T>. ơ ư
V y làm sao có th th c hi n m t cách chính xác khi làm vi c v i G<T>. Ví d nh ư
khi áp d ng hàm f v i m t List g m ph n t : e 1, e2, …, en nghĩa là ph i t o ra m t
danh sách các ph n t f(e 1), f(e2),…, f(en).
Áp d ng hàm f cho Optional<T> ch a ph n t v nghĩa là ph i t o Optional<U> ch a
f(v). Nh ng n u khi áp d ng f v i Optional<T> không có ph n t nào thì dĩ nhiênư ế
Optional<U> cũng s không có m t ph n t nào.
Áp d ng hàm f cho Future<T> thì s đc th c hi n ch khi nó có giá tr . K t qu tr ượ ế
v là Future<U>.
Thông th ng khi ti n hành x lý thì chúng ta s s d ng m t ph ng th c đc g iườ ế ươ ượ
là “map”. Hi u đn gi n “map” s giúp chúng ta áp d ng hàm f t o ra G<U> t G<T> ơ
trong đó khi áp d ng f thì T U, vi c này s đc x lý m i ph n t trong hàm dó ượ
đó nó s d dàng ti n hành v i các tr ng h p c th nh List<T>, Optional<T> hay ế ườ ư
Future<T>.
Chúng ta có th th y “map” là m t ý t ng khá là đn gi n. Chúng ta có th làm ph c ưở ơ
t p h n khi nhìn vào function T ơ G<U> thay vì T U. M t ví d khi chúng ta l y
n i dung t trên web thông qua URL. Chúng ta s ph i m t m t ít th i gian đ l y
Page | 3
đc trang web v , sau đó s th c hi n function URL ượ Future<String>. Chúng ta s
ch đi URL đn, sau đó cho nó vào Function và ch đi chu i string tr v . Quá trình ế
ho t đng nh v y g i flatMap ư
D ng URL Future<String> chính là m t tr ng h p c th c a “flatMap”. Thay vì ườ
chuy n t đi t ng G<T> ượ G<U> nó ti n hành chuy n t T ế G<U>.
đây s d ng flatMap cho Optional<T> cũng đc. Chúng ta s có function T ượ
Optional<U>, flatMap s gi i nén các giá tr trong Optional và áp d ng vào function
(tr khi c giá tr ban đu và giá tr k t qu đu không t n t i). ế
Trên đây là nh ng ki n th c v Monadic Operations. Đây là m t ki n th c khá m i ế ế
nên m i đu đc còn khó hi u sau đây chúng ta s cùng tìm hi u m t ví d đ có th
hi u rõ h n v ch đ này. ơ
public class Optional<T> {
private static final Optional<?> EMPTY = new Optional<>(null);
private final T value;
private Optional(T value) {
this.value = value;
}
public<U> Optional<U> map(Function<? super T, ? extends U> f) {
return value == null ? EMPTY : new Optional(f.apply(value));
}
public<U> Optional<U> flatMap(Function<? super T, Optional<U>> f) {
return value == null ? EMPTY : f.apply(value);
}
}
Nhìn vào class Optional<T> ta có th th y.
Ph ng th c map: Đn gi n là s d ng hàm f: Optional<T> ươ ơ Optional<U> trong đó
U = f.apply(value).
Ph ng th c flatMap: Nó không t o ra m t giá tr m i Optional<U> thông quaươ
Optional<T> mà nó s phân tích trong Optional và tr v m t đi t ng khác thông qua ượ
hàm f.apply(value).
Sau đây ta s có m t ví d chi ti t sau: Đ tìm tên b o hi m c a xe c a m t ch xe, ế
thông th ng ta s th c hi n khai báo các l p nh sau:ườ ư
Page | 4
public class Person {
private Car car;
public Car getCar() { return car; }
}
public class Car {
private Insurance insurance;
public Insurance getInsurance() { return insurance; }
}
public class Insurance {
private String name;
public String getName() { return name; }
}
Và đ l y đc tên b o hi m ta ph i s d ng bi u th c. ư
String getCarInsuranceName(Person person) {
if (person != null) {
Car car = person.getCar();
if (car != null) {
Insurance insurance = car.getInsurance;
if (insurance != null) {
return insurance.getName()
}
}
}
return "Unknown";
}
Vi c tìm nh th này khá là m t công và ph i duy t t ng đi sâu vào các l p. ư ế ươ
N u không s d ng cách trên ta có th s d ng cách sau:ế
String getCarInsuranceName(Person person) {
if (person == null) {
return "Unknown";
}
Car car = person.getCar();
if (car == null) {
return "Unknown";
}
Page | 5