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:
() -> 1Bạ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ề 1Vớ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.0Chúng ta cũng có thể tạo ra 1 interface generic hơn như sau:
public interface MyInterfaceTừ đó ta có thể định nghĩa interface đó với đầu vào là String{ public T func(T t); }
MyInterfaceHoặc có thể định nghĩa parameter là DoublemyInterface1 = (str) -> str + " is my friend"; System.out.println(myInterface1.func("cuong")); //cuong is my friend
MyInterfacemyInterface2 = (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:
ListNhiệ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:names = Arrays.asList(new Name("le","cuong"),new Name("nguyen","hung"),new Name("le","nam"));
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.
0 nhận xét:
Đăng nhận xét