
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

