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 đó.
List<Integer> values = Arrays.asList(1,2,3,4,5,6);
values.forEach(Consumer<? super T>)
forEach: là một method. Tham số truyền vào cho method này là một Consumer<? super T>. Vậy cần phải khởi tạo một instance cho interface này để có thể sử dụng, nó được thiết kế là một Generic Types: <? 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
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
Ví dụ muốn in ra list các số có sử dụng Consumer
Consumer<? super T>
. Vậy cần phải khởi tạo một instance cho interface này để có thể sử dụng, nó được thiết kế là một Generic Types:<? super T>
Sau đó có thể truyền
value
instance vào.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ư sauVì 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ó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
hoặc sử dụng "method reference"