GP Coder

Trang chia sẻ kiến thức lập trình Java

  • Java Core
    • Basic Java
    • OOP
    • Exception Handling
    • Multi-Thread
    • Java I/O
    • Networking
    • Reflection
    • Collection
    • Java 8
  • Design pattern
    • Creational Pattern
    • Structuaral Pattern
    • Behavior Pattern
  • Web Service
    • SOAP
    • REST
  • JPA
  • Java library
    • Report
    • Json
    • Unit Test
  • Message Queue
    • ActiveMQ
    • RabbitMQ
  • All
Trang chủ Java Core Java 8 Functional Interface trong Java 8

Functional Interface trong Java 8

Đăng vào 30/04/2018 . Được đăng bởi GP Coder . 31625 Lượt xem . Toàn màn hình

Trong bài trước, tôi đã giới thiệu với các bạn Interface trong Java 8 là Default method và Static method. Trong bài này, chúng ta tiếp tục tìm hiểu một khái niệm mới về Interface trong Java 8 là Functional Interface.

Trước khi tìm hiểu Functional Interface, chúng ta hãy cùng so sánh thế nào Lập trình hướng đối tượng (Object Oriented Programming – OOP) và Lập trình hướng chức năng (Functional Programming – FP) trong Java.

Nội dung

  • 1 So sánh Object-Oriented Programming vs Functional Programming
  • 2 Functional Interface là gì?
  • 3 Quy tắc khai báo Functional Interface
  • 4 Các Functional Interface đã được định nghĩa trong Java 8 – Java Predefined-Functional Interfaces

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.

Chi tiết các bạn có thể tham khảo thêm tại link sau:

  • https://www.ntu.edu.sg/home/ehchua/programming/java/JDK8_NewFeatures.html#zz-1.

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 đó.

Quy tắc khai báo Functional Interface

Một Functional Interface hợp lệ chỉ có duy nhất một method trừu tượng.


package com.gpcoder.functional_interface;

@FunctionalInterface
public interface DemoFunctionalInterface {

	void doSomething();

}

Functional Interface bên dưới không hợp lệ vì không có bất kỳ phương thức trừu tượng nào.

Functional Interface bên dưới cũng không hợp lệ vì có nhiều hơn một method trừu tượng.

Một Functional Interface có thể có các phương thức của lớp java.lang.Object.


package com.gpcoder.functional_interface;

@FunctionalInterface
public interface DemoFunctionalInterface2 {

	void doSomething();

	int hashCode();

	String toString();

	boolean equals(Object obj);
}

Functional Interface bên dưới cũng không hợp lệ, bởi vì nó chỉ khai báo các phương thức của lớp Java.lang.Object. Không có bất kỳ phương thức trừu tượng nào của riêng nó.

Functional Interface bên dưới cũng không hợp lệ, bởi vì phương thức clone() của lớp java.lang.Object có phạm truy cập là protected, trong khi tất cả các phương thức trừu tượng của interface đều là public abstract nên phưng thức clone() này không phải là override lại phương thức clone() của lớp Object. Do đó interface này được xem như khai báo 2 phương thức doSomething() và clone(), nên vi phạm nguyên tắc của Functional Interface.

Phương thức default and static không phá vỡ quy tắc của functional interface.


package com.gpcoder.functional_interface;

@FunctionalInterface
public interface DemoFunctionalInterface3 {

	void doSomething();

	default void defaultMethod1() {

	}

	default void defaultMethod2() {

	}

	static void staticMethod() {

	}

}

Một Functional Interface có thể mở rộng một Interface khác chỉ khi nó không có bất kỳ phương thức trừu tượng nào.


package com.gpcoder.functional_interface;

interface BaseInterface1 {
	void base();
}

interface BaseInterface2 {
	void base();
}

@FunctionalInterface
public interface DemoFunctionalInterface4 extends BaseInterface1, BaseInterface2 {

}

Functional Interface bên dưới không hợp lệ vì có Interface con có một phương thức trừu tượng doSomething() của riêng nó và kế thừa 1 phương thức base() từ Interface Base.

Các Functional Interface đã được định nghĩa trong Java 8 – Java Predefined-Functional Interfaces

Java cung cấp các Functional Interface được định nghĩa trước để xử lý lập trình functional bằng cách sử dụng các lambda expression và method references. Bạn cũng có thể định nghĩa Functional Interface tùy chỉnh của riêng bạn.

Danh sách các Functional Interface được đặt trong gói java.util.function. Các bạn có thể tham khảo theo link sau: https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html

Như vậy là chúng ta đã tìm hiểu xong một khái niệm mới trong Java 8 là Functional Interface. Trong các bài viết tiếp theo chúng ta sẽ cùng tìm hiểu một tính năng mới khác rất là hay trong Java 8 là Lambda Expression. Các bạn sẽ thấy được lợi ích và cách sử dụng của Lamda Expression và Functional Interface trong Java 8 như: Function, Predicate, Consumer, Consumer, …

Hy vọng bài viết này giúp ích cho các bạn. Cảm ơn các bạn đã quan tâm và theo dõi bài viết. Hẹn gặp lại ở bài viết tiếp theo.

4.5
30
Nếu bạn thấy hay thì hãy chia sẻ bài viết cho mọi người nhé! Và Donate tác giả

Shares

Chuyên mục: Java 8 Được gắn thẻ: Java 8

Interface trong Java 8 – Default method và Static method
Phương thức tham chiếu trong Java 8 – Method References

Có thể bạn muốn xem:

  • Date Time trong Java 8 (02/07/2018)
  • String Joiner trong Java 8 (23/07/2018)
  • Supplier trong Java 8 (04/06/2018)
  • Interface trong Java 8 – Default method và Static method (26/04/2018)
  • Tìm hiểu cơ chế Lazy Evaluation của Stream trong Java 8 (15/09/2019)

Bình luận

bình luận

Tìm kiếm

Bài viết mới

  • Clean code 13/01/2024
  • Giới thiệu CloudAMQP – Một RabbitMQ server trên Cloud 02/10/2020
  • Kết nối RabbitMQ sử dụng Web STOMP Plugin 19/06/2020
  • Sử dụng publisher confirm trong RabbitMQ 16/06/2020
  • Sử dụng Dead Letter Exchange trong RabbitMQ 13/06/2020

Xem nhiều

  • Hướng dẫn Java Design Pattern – Factory Method (98058 lượt xem)
  • Hướng dẫn Java Design Pattern – Singleton (97699 lượt xem)
  • Giới thiệu Design Patterns (87762 lượt xem)
  • Lập trình đa luồng trong Java (Java Multi-threading) (86433 lượt xem)
  • Giới thiệu về Stream API trong Java 8 (83838 lượt xem)

Nội dung bài viết

  • 1 So sánh Object-Oriented Programming vs Functional Programming
  • 2 Functional Interface là gì?
  • 3 Quy tắc khai báo Functional Interface
  • 4 Các Functional Interface đã được định nghĩa trong Java 8 – Java Predefined-Functional Interfaces

Lưu trữ

Thẻ đánh dấu

Annotation Authentication Basic Java Behavior Pattern Collection Creational Design Pattern Cấu trúc điều khiển Database Dependency Injection Design pattern Eclipse Exception Executor Service Google Guice Gson Hibernate How to Interceptor IO Jackson Java 8 Java Core JDBC JDK Jersey JMS JPA json JUnit JWT Message Queue Mockito Multithreading OOP PowerMockito RabbitMQ Reflection Report REST SOAP Structuaral Pattern Swagger Thread Pool Unit Test Webservice

Liên kết

  • Clean Code
  • JavaTpoint
  • Refactoring Guru
  • Source Making
  • TutorialsPoint
  • W3Schools Online Web Tutorials

Giới thiệu

GP Coder là trang web cá nhân, được thành lập với mục đích lưu trữ, chia sẽ kiến thức đã học và làm việc của tôi. Các bài viết trên trang này chủ yếu về ngôn ngữ Java và các công nghệ có liên quan đến Java như: Spring, JSF, Web Services, Unit Test, Hibernate, SQL, ...
Hi vọng góp được chút ít công sức cho sự phát triển cộng đồng Coder Việt.

Donate tác giả

Tìm kiếm các bài viết của GP Coder với Google Search

Liên hệ

Các bạn có thể liên hệ với tôi thông qua:
  • Trang liên hệ
  • Linkedin: gpcoder
  • Email: contact@gpcoder.com
  • Skype: ptgiang56it

Follow me

Copyright 2025 © GP Coder · All Rights Reserved · Giới thiệu · Chính sách · Điều khoản · Liên hệ ·

Share

Blogger
Delicious
Digg
Email
Facebook
Facebook messenger
Flipboard
Google
Hacker News
Line
LinkedIn
Mastodon
Mix
Odnoklassniki
PDF
Pinterest
Pocket
Print
Reddit
Renren
Short link
SMS
Skype
Telegram
Tumblr
Twitter
VKontakte
wechat
Weibo
WhatsApp
X
Xing
Yahoo! Mail

Copy short link

Copy link