12/08/2018, 15:54

Cùng tìm hiểu về biểu thức Lambda

Biểu thức Lambda là gì? Biểu thức lambda bản chất chỉ là một cách viết khác của Anonymous Inner Class theo một cách ngắn gọn hơn, làm cho đoạn code trông "sạch" hơn. Anonymous Inner Class (Lớp vô danh) là một lớp java không có tên, để sử dụng nó, bạn sẽ phải override các phương thức của class ...

Biểu thức Lambda là gì?

Biểu thức lambda bản chất chỉ là một cách viết khác của Anonymous Inner Class theo một cách ngắn gọn hơn, làm cho đoạn code trông "sạch" hơn.

Anonymous Inner Class (Lớp vô danh) là một lớp java không có tên, để sử dụng nó, bạn sẽ phải override các phương thức của class hoặc interface. Một Anonymous Inner Class có thể được tạo từ một class hoặc interface.

Ví dụ:

abstract class Animal {
    abstract void speak();
}
Animal a = new Animal() {
    void speak() {
        System.out.println("Woff");
    }
};

Sử dụng

Trong android, chúng ta thường sử dụng anonymous inner class như là một listener, ví dụ như sự kiện click vào button:

Button btn = findViewById(R.id.button);
btn.setOnClickListener(
        new View.OnClickListener() {
            @Override
            public void onClick(final View view) {
                // Do some fancy stuff with the view parameter.
            }
        }
);

Quay trở lại với biểu thức lambda. Chú ý đến đoạn code chứa anonymous inner class:

new View.OnClickListener() {
    @Override
    public void onClick(final View view) {
        // Do some fancy stuff with the view parameter.
    }
}

Điều kiện để sử dụng biểu thức lambda là chỉ có thể sử dụng khi anonymous inner class chỉ có 1 phương thức cần override. Thật may là View.OnClickListener cũng chỉ có 1 phương thức là onClick(View view). Khi chuyển sang dùng biểu thức lambda ta chỉ cần giữ lại tên biến view và thêm vào sau -> giống như sau:

(view) -> {
    // Do some fancy stuff with the view parameter.
}

Trong một số trường hợp ta có thể thêm vào kiểu của tham số nếu trình biên dịch không thể nhận ra bằng cách thêm kiểu vào đằng trước tham số:

(View view) -> {
    // Do some fancy stuff with the view parameter.
}

Nếu bạn có một interface chứa một phương thức có 2 tham số chẳng hạn...

interface MyInterface {
    abstract void onMethod(int a, int b);
}

... thì biểu thức lambda sẽ viết là:

(a, b) -> {
    // Do some fancy stuff with the a and b parameter.
}

Nếu phương thức có chứa kiểu trả về...

interface MySecondInterface {
    abstract int onSecondMethod(int a, int b);
}

...biểu thức lambda sẽ là:

(a, b) -> {
    return a + b;
}

Một số trường hợp đặc biệt ta có thể làm cho đoạn code ngắn hơn, nếu trong phần thân của phương thức chỉ chứa một dòng code thì ta có thể xoá phần ngoặc nhọn { } và dấu chấm phẩy ;, đoạn code trên chỉ còn lại như này:

(a, b) -> a + b

Như vậy, từ cách viết thông thường là

new MySecondInterface() {
    @Override
    public int onSecondMethod(final int a, final int b) {
        return a + b;
    }
};

ta đã có thể viết ngắn gọn hơn với lambda:

(a, b) -> a + b

Method references

Giả sử ta có một interface và một phương thức sử dụng interface đó như là một tham số truyền vào như sau:

public interface Callback {
    public void onEvent(int event);
}
public void myMethod(Callback callback){

}

Nếu không sử dụng lambda:

MyMethod(new Callback() {
    @Override
    public void onEvent(final int state) {
        System.out.println(state);
    }
});

Bằng cách sử dụng lambda như trước thì ta có thể viết lại là:

myMethod(state -> System.out.println(state));

Nhưng hay hơn là, nếu đoạn code sử dụng chỉ có 1 dòng và hàm được gọi chỉ lấy một tham số cũng chính là tham số của hàm ta có thể sử dụng lambda method reference như sau:

MyMethod(System.out::println);

Tham số sẽ được tự động truyền vào mà không cần viết thêm đoạn code nào. Thật tuyệt phải không nào! Mong rằng bạn sẽ học được điều gì mới từ bài viết!

Bài viết được tham khảo từ: https://android.jlelse.eu/lambda-expressions-explained-283737e87ee0

0