intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Đề tài: Tìm hiểu về Monadic Operations

Chia sẻ: Vanthang Thang | Ngày: | Loại File: DOCX | Số trang:9

80
lượt xem
5
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Mời các bạn cùng tham khảo nội dung đề tài "Tìm hiểu về Monadic Operations" dưới đây để nắm bắt được những nội dung lý thuyết programing with lamdas, monadic operations, câu hỏi đưa ra về Monadic Operations. Đây là tài liệu tham khảo hữu ích cho các bạn đang học và nghiên cứu về lập trình công nghệ thông tin.

Chủ đề:
Lưu

Nội dung Text: Đề tài: Tìm hiểu về Monadic Operations

  1. 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
  2. Contents Page | 2
  3. 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 với một tham số. Nó bao gồm một   số dữ liệu cụ thể hơn như: 1. List: Bao gồm một hoặc nhiều giá trị loại T. 2. Optional: Không có giá trị hoặc chỉ có một giá trị loại T. 3. Future:  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. Thông thường thì chúng ta sẽ phải làm việc với các dữ liệu G (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, Optional hay Future.   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. Ví dụ  như  khi áp dụng hàm f với một List gồm phần tử: e1, e2, …, en  nghĩa là phải tạo ra một  danh sách các phần tử f(e1), f(e2),…, f(en). Áp dụng hàm f cho Optional chứa phần tử v nghĩa là phải tạo Optional chứa   f(v). Nhưng nếu khi áp dụng f với Optional không có phần tử  nào thì dĩ nhiên   Optional cũng sẽ không có một phần tử nào. Áp dụng hàm f cho Future thì sẽ được thực hiện chỉ khi nó có giá trị. Kết quả trả  về là Future. 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 từ G  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, Optional hay   Future. 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 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
  4. được trang web về, sau đó sẽ thực hiện function URL   Future. 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 chính là một trường hợp cụ  thể của “flatMap”. Thay vì  chuyển từ đối tượng G  G nó tiến hành chuyển từ T  G. Ở  đây sử  dụng flatMap cho Optional cũng được. Chúng ta sẽ  có function T    Optional, 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 {          private static final Optional EMPTY = new Optional(null);          private final T value;          private Optional(T value) {                this.value = value;          }          public Optional map(Function
  5. 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
  6.         Insurance insurance = car.getInsurance();         if (insurance == null) {              return "Unknown";         }         return insurance.getName() } Thì khi áp dụng cách này thì ta sẽ có rất nhiều lựa chọn (thông qua nhiều câu lệnh if)   nhìn khá tốn code khi lập trình. Ta có thể tiến hành giải quyết như sau: Ta sẽ khởi tạo 3 lớp như sau: public class Person {      private Optional car;      public Optional getCar() { return car; } } public class Car {      private Optional insurance;      public Optional getInsurance() { return insurance; } } public class Insurance {      private String name;      public String getName() { return name; } } Việc áp dụng phương pháp Optional thì khi muốn lấy tên bảo hiểm xe từ  một người  nào đó ta chỉ cần gọi lệnh sau: String getCarInsuranceName(Optional person) {       return person.flatMap(person ­> person.getCar())       .flatMap(car ­> car.getInsurance())       .map(insurance ­> insurance.getName())       .orElse("Unknown"); } Hiểu đơn giản về hàm getCarInsuranceName trên như sau: Câu lệnh flatMap(person ­> person.getCar()) sẽ  lấy tên Optional car từ  lớp Optional  person. Tức là sau câu lệnh này ta sẽ được Optional car. Page | 6
  7. Tương tự fatMap(car ­> car.getInsurance()) ta sẽ có được Optional của Insurance. Và câu lệnh map(insurance ­> insurance.getName()) ta sẽ có tên của bảo hiểm tương  ứng với person nào đó. Nếu không có giá trị trả về thì nó cho ra kết quả “Unknown”. II. Câu hỏi đưa ra. Bài 1: Điểm khác biệt giữa phương thức map và flatMap trong Monadic Operations  là gì. A. map để  chuyển đổi một kiểu dữ  liệu từ  dạng này sang dạng khác còn  flatMap thì không. B. Nếu   có   phương   thức   f:   TU   thì   trong   “map”   f:   Optional  Optional còn trong “flatMap” f:T­>Optional. C.   “map” thực chất là một hàm giúp cho ta biểu diễn ngắn gọn các biểu  thức sử dụng “flatmap” D. Cả 3 ý trên đều đúng. Đáp án: B. Bài 2: Monadic Operation là gì? A. Đây là tên một phương thức trong java 8. B. Đây là một Pattern mới trong java 8. C. Đây là một cách biểu diễn dữ liệu hỗ trợ cho người lập trình trong việc  xử lý các lỗi mà điển hình là NullPoiterExeption. D. Đây là một công cụ hỗ trợ trong việc lập trình java. Đáp án: C Bài 3: Cho hàm sau:  public Optional flatMap(Function
  8. A. public Optional map(Function
  9. Tài liệu tham khảo Java SE 8 for the Really Impatient. Monadic Java by Mario Fusco. Page | 9
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2