Thứ Năm, 25 tháng 4, 2019

Lambda expression trong Java 8

Nếu là 1 java developer, và đã xài qua java 8, chắc chắn bạn sẽ nghe nói tới lambda expression. Đây là 1 phần mới đc thêm vào trong java 8, và nó thực sự rất hữu ích nếu chúng ta biết tận dụng để viết code. Nhưng trước khi đi vào tìm hiểu lambda expression, bạn phải tìm hiểu một khái niệm khác gọi là : Functional interface.

Functional interface là gì?

Functional interface là một interface chỉ có chứa 1 abstract method duy nhất.
Ví dụ, interface dưới đây là functional interface.
public interface MyInterface{
    double getValue();
}
Còn interface dưới đây không phải là functional interface, vì có đến 2 abstract method.
public interface MyInterface{
    double getValue();
    double getUnit();
}
Trước khi có lambda expression, để sử dụng MyInterface chúng ta phải code như sau:
MyInterface myInterface = new MyInterface() {
   @Override
   public double getValue() {
    return 1;
   }
  };
Đoạn code trên chúng ta đã hiện thực hàm getValue để trả về 1. Nhưng vấn đề nằm ở chỗ, MyInterface của chúng ta chỉ có duy nhất 1 method nên việc ta phải viết lại cả tên method khi hiện thực là thừa thải. Đó là lí do ông nội lambda expression ra đời.

Lambda expression

Lambda expression trong java là dấu "->", nó giúp ta định nghĩa 1 method bằng dòng code siêu ngắn gọn vì ta không cần phải viết lại tên method đang hiện thực nữa. Ví dụ ta có hàm getValue() khi viết bình thường sẽ như sau:
double getValue(){ return 1;}
Nhưng với lambda expression ta sẽ viết được như sau:
() -> 1
Bạn thấy đấy, code của chúng ta ngắn hơn 1 cách đáng kinh ngạc. Minh sẽ đưa ra một số ví dụ cho những trường hợp khác khi ta dùng lambda expression. Ví dụ ta có 1 method void như sau:
void sayHello(){
    System.out.println("Hello");
}
Method trên có chức năng viết ra "hello". Với lambda expression, ta có thể viết như sau:
() -> System.out.println("Hello");
Cũng với method trên, nếu ta muốn in ra hai dòng là "hello" và "world" thì ta có:
void sayHello(){
    System.out.println("Hello");
    System.out.println("World");
}
Với lambda expression:
() -> {
    System.out.println("Hello");
    System.out.println("World");
}
Với method có parameter như method sau:
void sayHelloToPerson(String name){
    System.out.println("Hello" + name);
}
Ta cũng viết lại được dưới dạng lambda expression:
(name) -> System.out.println("Hello" + name);
Vậy ta dùng lambda expression như thế nào? Lamdba expression ko phải cứ muốn tùy tiện viết là viết đâu nhé. Nó phải viết dựa trên 1 functional interface đã có từ trước. Ví dụ với "MyInterface" của chúng ta, bây giờ ta có thể sử dụng nó bằng cách:
MyInterface myInterface = () -> 1;
myInterface.getValue(); //trả về 1
Với lamdba expression, mọi thứ đều trở nên ngắn hơn, vậy nên hãy tin dùng lambda expression.!!! Ta đi tiếp 1 ví dụ nữa nhé! Giả sử ta có 1 functional interface thứ 2.
public interface MyInterface2{
    double sum(double a, double b);
}
Ta có thể sử dụng interface này với lambda expression như sau:
MyInterface2 myInterface2 = (a,b) -> a+b;
System.out.println(myInterface2.sum(2, 3)); //in ra 5.0
Chúng ta cũng có thể tạo ra 1 interface generic hơn như sau:
public interface MyInterface {
 public T func(T t);
}
Từ đó ta có thể định nghĩa interface đó với đầu vào là String
MyInterface myInterface1 = (str) -> str + " is my friend";
System.out.println(myInterface1.func("cuong")); //cuong is my friend
Hoặc có thể định nghĩa parameter là Double
MyInterface myInterface2 = (number) -> number + 1;
System.out.println(myInterface2.func(1.0)); //2.0

Lambda expression kết hợp Stream trong java 8

Java 8 không chỉ show hàng mỗi ông nội lambda, mà còn cho chúng ta thêm 1 thứ nữa gọi là stream. 2 cái mới này nếu ta biết sử dụng nó thì đúng là code ngắn 1 cách kinh khủng khiếp. Ví dụ ta có đối tượng:
public static class Name {
  public Name(String first, String last){
   this.firstName = first;
   this.lastName = last;
  }
  private String firstName;
  private String lastName;
  public String getFirstName(){
   return firstName;
  }
  public String getLasttName(){
   return lastName;
  }
 }
Và ta có danh sách 3 người như sau:
List names = Arrays.asList(new Name("le","cuong"),new Name("nguyen","hung"),new Name("le","nam"));
Nhiệm vụ bây h là ta sẽ lọc ra những người họ "le", và sau đó in ra tên (lastname) của người đó. Nếu như không sử dụng stream và lambda expression, thực sự lượng code của bạn phải viết ra khó có thể viết được trong 1 hay 2 dòng. Nhưng với stream + lambda expession, code của bạn siêu đẹp và siêu ngắn như sau:
System.out.println(names.stream().filter(name -> name.getFirstName().equals("le")).map(name -> name.getLasttName()).collect(Collectors.toList())); //in ra [cuong, nam]
Quá ngắn đúng không? Và đó là lambda expression. Bài viết được viết dựa trên bài viết của programiz. Cám ơn mọi người đã ghé đọc.
Share:
Được tạo bởi Blogger.