Lambda Expression trong java

Để tìm hiểu lambda expression trước tiên các bạn phải biết đến khái niệm anonymous class. Nếu bạn chưa biết đến anonymous class thì có thể đọc qua tại đây nhé. Nhưng cũng đừng lo, dưới đây mình sẽ lấy ví dụ về anonymous class. 

Tại sao phải sử dụng Lambda Expression

Chúng ta biết đến anonymous class như là một cách để giúp code chúng ta ngắn gọn hơn, thế nhưng có một vấn đề là đổi với interface chỉ có duy nhất một function, thì anonymous class vẫn chưa là phương án tối ưu.

Giả sử chúng ta có:

Cho một danh sách Students, tìm và in ra tất cả các Student tuổi >= 18 và có điểm >= 5.

Cách 1: Loop và kiểm tra từng Student

Cách 1 có vẽ là hoạt động tốt, nhưng nếu bạn muốn thay đổi lại điều kiện vd như tuổi >= 10 và score >=7 thì sao? Ok mình sẽ giải quyết nó bằng cách 2

Cách 2: Loop và kiểm tra Student theo parameter

Với cách 2, mình có thể đối phó với các yêu cầu về độ tuổi và điểm khác nhau. 

Thế nhưng, những nơi khác cũng cần kiểm tra các Student nhưng không phái để xuất ra màn hình mà có thể là export, update, remove, v.v. Thì bạn sẽ không thể sử dụng lại logic lọc ở đây.

Tất nhiên bạn có thể tách logic lọc ra một function rồi gọi đến, nhưng cách này thường sẽ làm cho code của bạn không trông khó đọc. 

Cách 3: Sử dụng local class

Trước tiên, chúng ta cần define một interface CheckStudent có một phương thức test(), class CheckStudentImpl implements CheckStudent

Chúng ta có class CheckStundentImpl implements CheckStudent. Hàm test() được sử dụng để kiểm tra Student theo một tiêu chí nhất định được đặt trong interface CheckStudent sẽ làm cho rõ nghĩa của function hơn, sau này chúng ta muốn kiểm tra theo các tiêu chí khác thì chỉ cần viết thêm hàm vào imterface và tiến hành implement hàm đó là xong thôi =))).

Để sử dụng local class CheckStudentImpl được định nghĩa ở trên chúng ta sẽ làm như sau:

Cách 4: Sử dụng anonymous class

Việc sử dụng anonymous class sẽ giúp cho bạn bỏ qua bước khởi tạo class CheckStudentImpl

Ta thấy bằng cách sử dụng anonymous class ta không cần tạo thêm class CheckStudentImpl, code này trong có vẽ đã rất ổn. Nhưng mà vẫn còn một cách ngắn hơn nữa.

Cú pháp của lambda expression

<Parameter> -> {<Body>}

Nếu function của bạn đơn giản là trả về một kết quả của các điều kiện kết nhau thì có thể rút gọn cặp dấu “{}” và return. 

Câu trên có thể viết lại như sau: 

Bạn có đặt câu hỏi tại sao lambda expression được khai triển ở trên lại được hiểu là một implement của function test() của interface CheckStudent?

Câu trả lời đó là vì CheckStudent là interface chỉ có duy nhất một method (không kể default và static method) những interface có tính chất như vậy được gọi là @FunctionalInterface. Lúc này java nó sẽ tự hiểu là biểu thức lambda của mình viết chính là implement của function test().

Đặc điểm của lambda expression

Lambda expression chỉ là dạng rút gọn hơn của inner class, gần nhất là anonymous class nên nó cũng có các tính chất tương tự:

  • Truy cập các thành viên của lớp chứa nó.
  • Có thể truy cập được các thành viên của block chứa nó.
  • Không thể khai báo các thành viên static.
  • Không thể khai báo một interface bên trong lambda expression.

Link source code demo: lambda-expression-demo

Please follow and like us:
error

Leave a Reply

Your email address will not be published. Required fields are marked *