JavaRush /Blog Java /Random-VI /Nghỉ giải lao #182. Giao diện chức năng trong Java

Nghỉ giải lao #182. Giao diện chức năng trong Java

Xuất bản trong nhóm
Nguồn: DZone Dưới đây là tổng quan về các giao diện chức năng trong Java: mục đích, ví dụ, biểu thức lambda và danh sách các giao diện được xác định trước. Nghỉ giải lao #182.  Giao diện chức năng trong Java - 1Là ngôn ngữ lập trình hướng đối tượng, Java trước đây không thể có các chức năng độc lập vì mọi thứ ngoại trừ một số kiểu dữ liệu và phương thức nguyên thủy trong ngôn ngữ đều xoay quanh các lớp và đối tượng. Tuy nhiên, Java 8 đã giới thiệu một khái niệm mới gọi là Giao diện chức năng và một số tính năng khác như Biểu thức Lambda, API thời gian, API luồng, v.v. Các giao diện chức năng này là gì và làm thế nào để xác định chúng? Hãy cùng tìm hiểu!

Giao diện là gì?

Giao diện là một tập hợp các quy tắc xác định sự tương tác của các thành phần hệ thống. Nó còn được gọi là bản phác thảo của một lớp chứa các phương thức trừu tượng và các hằng tĩnh. Một giao diện có thể chứa một hoặc nhiều phương thức trừu tượng. Các giao diện cũng cho phép bạn đặt ra các yêu cầu cho các lớp, tức là các phương thức nào được yêu cầu từ lớp đó. Nói một cách đơn giản, một giao diện giống như một hợp đồng phải được mọi lớp triển khai tuân thủ. Đây là một ví dụ:
Interface A1
{
void method1();
String method2(String X);
}

Class A1 implements A
{
@Override
public void method1(){}
@Override
public String method2(String X) { return x; }
}
Nếu lớp triển khai giao diện không khai báo tất cả các phương thức của giao diện, mã sẽ không chạy và sẽ phát sinh lỗi: “ error: A1 is not abstract and not write đè phương thức trừu tượng trong A1. " (lỗi: A1 không trừu tượng và không ghi đè phương thức trừu tượng trong A1). Trước JDK 8, các giao diện không thể xác định cách triển khai, nhưng giờ đây các cách triển khai mặc định có thể được thêm vào cho các phương thức giao diện. Chúng ta cũng có thể định nghĩa các phương thức tĩnh và mặc định, trong đó có thể gọi mà không cần có đối tượng trong giao diện. Giao diện chủ yếu được sử dụng để đạt được tính đa kế thừa và khớp nối lỏng lẻo trong mã. Bây giờ chúng ta đã hiểu rõ về giao diện, hãy xem giao diện chức năng là gì và nó hoạt động như thế nào.

Giao diện chức năng là gì?

Giao diện chức năng còn được gọi là giao diện Phương thức trừu tượng đơn (SAM). Như tên cho thấy, nó có thể có nhiều nhất một phương thức trừu tượng. Một giao diện chức năng có thể có một số phương thức tĩnh và mặc định cùng với cách triển khai cũng như một phương thức trừu tượng bổ sung. Để đánh dấu một giao diện là có chức năng, chú thích @FunctionalInterface được sử dụng . Cần tránh khai báo sai các phương thức bổ sung. Điều làm cho giao diện chức năng trở nên phổ biến là khả năng sử dụng biểu thức lambda để tạo giao diện mà không cần sử dụng các triển khai lớp ẩn danh và rườm rà. Việc sử dụng từ khóa trừu tượng trong các giao diện chức năng là tùy chọn vì các phương thức được xác định trong một giao diện theo mặc định là trừu tượng.

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

Biểu thức lambda là một phương thức ẩn danh hoặc ẩn danh, không tự thực thi mà được sử dụng để triển khai một số phương thức nhất định của giao diện chức năng. Nó được định nghĩa như sau:
(parameter list) -> lambda body
Toán tử mũi tên ( -> ) bạn thấy trong mã được gọi là toán tử lambda. Ví dụ: nếu chúng ta có phương thức sau:
double getGoldenRatioValue() {
return 1.61803;
}
Sử dụng biểu thức lambda, chúng ta có thể viết nó như thế này:
() -> 1.61803
Như bạn có thể thấy, phương thức trong hàm lambda không có tham số nên phía bên trái của câu lệnh trống. Vì phía bên phải xác định hành động nên trong ví dụ này nó sẽ trả về giá trị của tỷ lệ vàng: 1,61803. Trước Java 8, việc triển khai các giao diện hoặc tạo các đối tượng lớp bên trong là rất quan trọng, nhưng với Java 8, tất cả những gì chúng ta cần làm bây giờ là gán các biểu thức lambda cho các giao diện chức năng.

Ví dụ về giao diện chức năng

Để tạo các giao diện chức năng, bạn có thể sử dụng chú thích @FunctionalInterface hoặc sử dụng các giao diện chức năng được xác định trước của Java.

ví dụ 1

  • Đầu tiên, chúng ta sẽ gắn thẻ @FunctionalInterface và tạo một giao diện có tên MyInterface được gọi bằng phương thức getGoldenRationValue() trừu tượng .
  • Sau đó chúng ta sẽ tạo một public class main để thực thi phương thức.
  • Để sử dụng biểu thức lambda trong giao diện chức năng, chúng ta sẽ khai báo một tham chiếu đến MyInterfaceDemo rồi gán biểu thức lambda cho tham chiếu đó.
  • Cuối cùng, chúng ta sẽ in ra giá trị tỷ lệ vàng bằng giao diện tham chiếu.
import java.lang.FunctionalInterface;

// Creation и маркировка функционального интерфейса
@FunctionalInterface

interface MyInterface {
// Это абстрактный метод
double getGoldenRatioValue();
}

public class Main {
public static void main( String[] args ) {

//декларируем ссылку на функциональный интерфейс
MyInterface ref;
//используем Lambda Expression
ref = () -> 1.61803;

System.out.println("Value of Golden Ratio = " + ref.getGoldenRatioValue());
}
}
Phần kết luận:
Giá trị của Tỷ lệ vàng = 1,61803

Ví dụ 2

  • Trong ví dụ này, chúng ta sẽ sử dụng giao diện hàm được xác định trước ToDoubleFunction , hàm này nhận đối số T và trả về kết quả là double .
  • ToDoubleFuntion chứa một phương thức trừu tượng được gọi là applyasDouble() .
  • Cuối cùng, chúng tôi in toàn bộ chiều dài của tin nhắn, bao gồm cả dấu cách.
import java.util.function.ToDoubleFunction;
public class MyInterface2 {

public static void main(String[] args) {

ToDoubleFunction<String> length = x -> x.length();

System.out.println(length.applyAsDouble("This is an example of predefined functional interface."));
}
}
Phần kết luận:
54,0

Danh sách các giao diện chức năng được cài đặt sẵn

Bây giờ chúng ta đã biết cách xác định các giao diện chức năng, hãy xem có bao nhiêu giao diện chức năng được xác định trước (tích hợp sẵn). Có 4 loại giao diện chức năng chính có thể được triển khai trong các tình huống khác nhau: Người tiêu dùng , Vị ngữ , Chức năngNhà cung cấp . Trong số 4 giao diện này, Consumer , FunctionPredicate có thêm các giao diện chức năng. Đây là danh sách tất cả các giao diện tích hợp hoặc được xác định trước trong Java. Ghi chú. T, U và R được đề cập trong bảng bên dưới lần lượt thể hiện loại đối số thứ nhất (T), đối số thứ hai (U) và kết quả (R) của thao tác.
Giao diện Kiểu
Có thể chạy được
BiConsumer(T, U) T, U →
BiFunction(T, U, R) T, U → R
Toán tử nhị phân T, T <→ R
BiPredicate<T, U> T, U → boolean
Nhà cung cấp Boolean → boolean
Người tiêu dùng T →
Toán tử nhị phân đôi gấp đôi, gấp đôi → gấp đôi
Người tiêu dùng đôi đôi →
chức năng kép đôi → R
Vị ngữ đôi đôi → boolean
Nhà cung cấp đôi boolean →
DoubleToIntFunction gấp đôi → int
Chức năng gấp đôi gấp đôi → dài
Toán tử đơn nhất đôi đôi → đôi
Chức năng<T, R> T → R
Toán tử nhị phân Int int → int
IntConsumer int →
hàm quốc tế int → R
IntPredicate int → boolean
nhà cung cấp quốc tế → int
Hàm IntToDouble int → gấp đôi
Chức năng IntToLong int → dài
Toán tử IntUnary int → int
Toán tử nhị phân dài dài, dài → dài
Người tiêu dùng dài dài →
Chức năng dài dài → R
vị từ dài dài →
Nhà cung cấp dài → dài
Chức năng dài tới gấp đôi dài → gấp đôi
Hàm LongToInt dài → int
LongUnaryOperator dài → dài
ObjDoubleNgười tiêu dùng T, đôi →
ObjIntConsumer T, int →
ObjLongNgười tiêu dùng T, dài →
Thuộc tính T → boolean
Nhà cung cấp → T
ToDoubleBiFunction<T, U> T, U → đôi
Để tăng gấp đôi chức năng T → đôi
ToIntBiFunction<T, U> T, U → int
ToIntHàm T → int
ToLongBiFunction<T, U> T, U → dài
Chức năng dài T → dài
Toán tử đơn nhất T → T

Hãy tóm tắt lại

Một số điểm chính cần nhớ từ bài đăng này:
  • Giao diện hoạt động như một cơ chế trừu tượng.
  • Một giao diện chức năng có thể có một số phương thức tĩnh và mặc định cùng với cách triển khai cũng như một phương thức trừu tượng bổ sung.
  • Các phương thức được xác định bên trong một giao diện chức năng theo mặc định là trừu tượng, vì vậy việc sử dụng từ khóa abstract không còn cần thiết nữa.
  • Biểu thức lambda là một phương thức ẩn danh không tự thực thi mà được sử dụng để triển khai một số phương thức nhất định của giao diện chức năng.
  • Để tạo các giao diện chức năng, bạn có thể sử dụng chú thích @FunctionalInterface hoặc sử dụng các giao diện chức năng được xác định trước của Java.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION