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. Còn interface dưới đây không phải là functional interface, vì có đến 2 abstract method.
public interface MyInterface{
double getValue();
}
Trước khi có lambda expression, để sử dụng MyInterface chúng ta phải code như sau:
public interface MyInterface{
double getValue();
double getUnit();
}
Đ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.
MyInterface myInterface = new MyInterface() {
@Override
public double getValue() {
return 1;
}
};
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:Nhưng với lambda expression ta sẽ viết được như sau:
double getValue(){ return 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:
() -> 1
Method trên có chức năng viết ra "hello". Với lambda expression, ta có thể viết như sau:
void sayHello(){
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ó:
() -> System.out.println("Hello");
Với lambda expression:
void sayHello(){
System.out.println("Hello");
System.out.println("World");
}
Với method có parameter như method sau:
() -> {
System.out.println("Hello");
System.out.println("World");
}
Ta cũng viết lại được dưới dạng lambda expression:
void sayHelloToPerson(String 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:
(name) -> System.out.println("Hello" + name);
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.
MyInterface myInterface = () -> 1;
myInterface.getValue(); //trả về 1
Ta có thể sử dụng interface này với lambda expression như sau:
public interface MyInterface2{
double sum(double a, double b);
}
Chúng ta cũng có thể tạo ra 1 interface generic hơn như sau:
MyInterface2 myInterface2 = (a,b) -> a+b;
System.out.println(myInterface2.sum(2, 3)); //in ra 5.0
Từ đó ta có thể định nghĩa interface đó với đầu vào là String
public interface MyInterface{
public T func(T t);
}
Hoặc có thể định nghĩa parameter là Double
MyInterfacemyInterface1 = (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:Và ta có danh sách 3 người như sau:
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;
}
}
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:
Listnames = Arrays.asList(new Name("le","cuong"),new Name("nguyen","hung"),new Name("le","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.
System.out.println(names.stream().filter(name -> name.getFirstName().equals("le")).map(name -> name.getLasttName()).collect(Collectors.toList())); //in ra [cuong, nam]
0 Nhận xét