Jacobvu84 / serenity-pageobject-junit-webdriver

4 stars 1 forks source link

What is Functional Interface ? #72

Open Jacobvu84 opened 4 years ago

Jacobvu84 commented 4 years ago

So sánh Object-Oriented Programming vs Functional Programming

Object-Oriented Programming (OOP) là một mô hình lập trình dựa trên khái niệm đối tượng (object), là kết hợp giữa data thể hiện dưới dạng các trường (field) hoặc thuộc tính (attribute) và code thể hiện dưới dạng thủ tục (procedure) hoặc phương thức (method).

Functional programming (FP) là một mô hình lập trình, một kiểu xây dựng cấu trúc và các phần tử của các chương trình, xử lý tính toán dựa trên các function và nó tránh thay đổi trạng thái, dữ liệu có thể thay đổi được (mutable data).

Trong một chương trình, có hai thành phần chính: dữ liệu và hành vi (behavior hoặc code). OOP nói rằng tập hợp dữ liệu và hành vi liên quan của nó thành một “đối tượng” giúp dễ hiểu hơn về cách thức hoạt động của một chương trình. FP nói rằng dữ liệu và hành vi là khác biệt rõ rệt và nên được giữ riêng biệt để rõ ràng.

Functional Interface là gì?

Java 8 gọi các Interface có duy nhất một method trừu tượng là các Functional Interface, nó cũng có thể được gọi là Single Abstract Method (SAM) một cụm từ đôi khi chúng ta bắt gặp.

Java 8 cũng giới thiệu một annotation mới là @FunctionalInterface. Nó có thể sử dụng cho mục đích bắt lỗi ở thời điểm biên dịch nếu vô tình thêm một method trừu tượng khác nữa vào interface có đánh dấu bởi annotation này mà vi phạm quy tắc của Functional Interface.

Lợi ích chính của functional interface là chúng ta có thể sử dụng Lambda Expression để tạo ra thể hiện (instance) cho interface đó.

Tham khảo: functional-interface-trong-java-8

Một số ví dụ về functional interface có sẵn trong java 8

Consumer

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);

    default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
}

Ví dụ muốn in ra list các số có sử dụng Consumer

List<Integer> values = Arrays.asList(1,2,3,4,5,6);
values.forEach(Consumer<? super T>)
        Consumer<Integer> value = new Consumer<Integer>() {

            @Override
            public void accept(Integer t) {
                System.out.println(t);
            }};

Sau đó có thể truyền value instance vào.

values.forEach(value)

Tuy nhiên do interface này chỉ có 1 method tên là accept ( tên do java đặt) nên ta có thể viết nó dưới dạng anonymous(that is, unnamed) method như sau

        Consumer<Integer> value = (Integer t) -> {
                System.out.println(t);
            };

Vì Consumer đã được khai báo là Integer nên có thể viết (Integer t) thành (t) và phương thức anonymous này chỉ có 1 lệnh nên có thể bỏ block code. Cuối cùng ta có

        Consumer<Integer> value =  t -> System.out.println(t);

Vậy kết quả cuối cùng ta có thể viết lại việc in ra một list các số Integer như sau

List<Integer> values = Arrays.asList(1,2,3,4,5,6);
values.forEach(t -> System.out.println(t));

hoặc sử dụng "method reference"

List<Integer> values = Arrays.asList(1,2,3,4,5,6);
values.forEach(System.out::println);
Jacobvu84 commented 4 years ago

https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html