Java 函數式接口(Functional Interface)

一、理論說明

1. 函數式接口的定義

Java 函數式接口是一種特殊的接口,它只包含一個抽象方法(Single Abstract Method, SAM),但可以包含多個默認方法或靜態方法。函數式接口是 Java 8 引入 Lambda 表達式的基礎,通過函數式接口可以將行為作為參數傳遞,實現更簡潔、靈活的代碼。

2. 核心特性

  • @FunctionalInterface 注解:可選注解,用于標記接口為函數式接口,編譯器會檢查該接口是否只有一個抽象方法。
  • 與 Lambda 表達式的關系:Lambda 表達式是函數式接口的實例,可直接賦值給函數式接口類型的變量。
  • 內置函數式接口:Java 8 在?java.util.function?包中提供了一系列通用的函數式接口,如?PredicateFunctionConsumer?等。

二、內置函數式接口

Java 8 提供了四大核心函數式接口,覆蓋了常見的函數式編程場景:

1.?Predicate<T>

接收一個參數,返回布爾值,用于判斷條件。

@FunctionalInterface
public interface Predicate<T> {boolean test(T t);
}// 使用示例
Predicate<Integer> isEven = num -> num % 2 == 0;
System.out.println(isEven.test(4)); // 輸出: true

2.?Function<T, R>

接收一個參數,返回另一個類型的結果,用于類型轉換。

@FunctionalInterface
public interface Function<T, R> {R apply(T t);
}// 使用示例
Function<String, Integer> strLength = s -> s.length();
System.out.println(strLength.apply("hello")); // 輸出: 5

3.?Consumer<T>

接收一個參數,不返回結果,用于消費數據。

@FunctionalInterface
public interface Consumer<T> {void accept(T t);
}// 使用示例
Consumer<String> printer = s -> System.out.println(s);
printer.accept("Hello, World!"); // 輸出: Hello, World!

4.?Supplier<T>

不接收參數,返回一個結果,用于提供數據。

@FunctionalInterface
public interface Supplier<T> {T get();
}// 使用示例
Supplier<Double> randomSupplier = () -> Math.random();
System.out.println(randomSupplier.get()); // 輸出隨機數

三、自定義函數式接口

可以通過?@FunctionalInterface?注解定義自己的函數式接口:

@FunctionalInterface
public interface Calculator {int calculate(int a, int b); // 唯一的抽象方法// 默認方法(非抽象)default void printResult(int result) {System.out.println("計算結果: " + result);}
}// 使用 Lambda 表達式實現
Calculator adder = (a, b) -> a + b;
Calculator subtractor = (a, b) -> a - b;System.out.println(adder.calculate(5, 3)); // 輸出: 8
adder.printResult(10); // 輸出: 計算結果: 10

四、方法引用(Method Reference)

方法引用是 Lambda 表達式的一種簡化形式,用于直接引用已存在的方法。

1. 靜態方法引用

// Lambda 表達式
Function<String, Integer> parseInt = s -> Integer.parseInt(s);// 方法引用
Function<String, Integer> parseIntRef = Integer::parseInt;

2. 實例方法引用

// Lambda 表達式
Consumer<String> printer = s -> System.out.println(s);// 方法引用
Consumer<String> printerRef = System.out::println;

3. 構造方法引用

// Lambda 表達式
Supplier<List<String>> listSupplier = () -> new ArrayList<>();// 方法引用
Supplier<List<String>> listSupplierRef = ArrayList::new;

五、應用實例

1. 集合過濾(Predicate)

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class FilterExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);// 過濾偶數List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0) // 使用 Predicate.collect(Collectors.toList());System.out.println(evenNumbers); // 輸出: [2, 4, 6]}
}

2. 數據轉換(Function)

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class MapExample {public static void main(String[] args) {List<String> words = Arrays.asList("hello", "world");// 轉換為大寫List<String> upperCaseWords = words.stream().map(String::toUpperCase) // 使用 Function.collect(Collectors.toList());System.out.println(upperCaseWords); // 輸出: [HELLO, WORLD]}
}

3. 事件處理

@FunctionalInterface
public interface ClickListener {void onClick(String event);
}public class Button {private ClickListener listener;public void setOnClickListener(ClickListener listener) {this.listener = listener;}public void simulateClick() {if (listener != null) {listener.onClick("Button clicked");}}
}// 使用 Lambda 表達式處理事件
Button button = new Button();
button.setOnClickListener(event -> System.out.println("處理事件: " + event));
button.simulateClick(); // 輸出: 處理事件: Button clicked

六、面試題

題目:

答案:

七、自我總結

函數式接口是 Java 函數式編程的核心,它結合 Lambda 表達式和方法引用,使代碼更簡潔、更具表現力。關鍵要點包括:

  1. 定義規則:函數式接口只能有一個抽象方法,但可以包含默認方法和靜態方法。
  2. 內置接口PredicateFunctionConsumer?和?Supplier?覆蓋了常見場景。
  3. 方法引用:簡化 Lambda 表達式,提高代碼可讀性。
  4. 與 Stream API 結合:在集合處理中發揮強大作用。

在實際開發中,函數式接口常用于回調、事件處理、集合操作等場景,能夠有效減少樣板代碼,提升開發效率。但需注意避免過度使用復雜的 Lambda 表達式,保持代碼的可維護性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906833.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906833.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906833.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【python代碼】一些小實驗

目錄 1. 測試Resnet50 ONNX模型的推理速度 1. 測試Resnet50 ONNX模型的推理速度 ############################### # 導出resnet50 模型 # 測試onnx模型推理 cpu 和 GPU 的對比 ###############################import time import numpy as np import onnxruntime as ort im…

5.Java 面向對象編程入門:類與對象的創建和使用?

在現實生活中&#xff0c;我們常常會接觸到各種各樣的對象&#xff0c;比如一輛汽車、一個學生、一部手機等。這些對象都具有各自的屬性和行為。例如&#xff0c;汽車有顏色、品牌、型號等屬性&#xff0c;還有啟動、加速、剎車等行為&#xff1b;學生有姓名、年齡、學號等屬性…

從開發者角度看數據庫架構進化史:JDBC - 中間件 - TiDB

作者&#xff1a; Lucien-盧西恩 原文來源&#xff1a; https://tidb.net/blog/e7034d1b Java 應用開發技術發展歷程 在業務開發早期&#xff0c;用 Java 借助 JDBC 進行數據庫操作&#xff0c;雖能實現基本交互&#xff0c;但需手動管理連接、編寫大量 SQL 及處理結果集&a…

工業智能網關建立烤漆設備故障預警及遠程診斷系統

一、項目背景 烤漆房是汽車、機械、家具等工業領域廣泛應用的設備&#xff0c;主要用于產品的表面涂裝。傳統的烤漆房控制柜采用本地控制方式&#xff0c;操作人員需在現場進行參數設置和設備控制&#xff0c;且存在設備智能化程度低、數據孤島、設備維護成本高以及依靠傳統人…

故障率預測:基于LSTM的GPU集群硬件健康監測系統(附Prometheus監控模板)

一、GPU集群健康監測的挑戰與價值 在大規模深度學習訓練場景下&#xff0c;GPU集群的硬件故障率顯著高于傳統計算設備。根據2023年MLCommons統計&#xff0c;配備8卡A100的服務器平均故障間隔時間&#xff08;MTBF&#xff09;僅為1426小時&#xff0c;其中顯存故障占比達38%&…

Vue 樣式不一致問題全面分析與解決方案

文章目錄 1. 問題概述1.1 問題表現1.2 問題影響 2. 根本原因分析2.1 Vue 的渲染機制與樣式加載時機2.2 Scoped CSS 的工作原理2.3 CSS 模塊化與作用域隔離2.4 樣式加載順序問題2.5 熱重載(HMR)與樣式更新 3. 解決方案3.1 確保樣式加載順序3.1.1 預加載關鍵 CSS3.1.2 控制全局樣…

[免費]微信小程序寵物醫院管理系統(uni-app+SpringBoot后端+Vue管理端)【論文+源碼+SQL腳本】

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;看到一個不錯的微信小程序寵物醫院管理系統(uni-appSpringBoot后端Vue管理端)&#xff0c;分享下哈。 項目視頻演示 【免費】微信小程序寵物醫院管理系統(uni-appSpringBoot后端Vue管理端) Java畢業設計_嗶哩嗶哩_bilibi…

測試總結(一)

一、測試流程 參與需求評審-制定測試計劃-編寫測試用例-用例評審-冒煙測試-測試執行-缺陷管理-預發驗收測試-發布線上-線上回歸-線上觀察-項目總結 二、測試用例設計方法 等價類劃分&#xff08;處理有效/無效輸入&#xff09; 邊界值分析&#xff08;臨界值測試&#xff09…

SAP-ABAP:ABAP異常處理與SAP現代技術融合—— 面向云原生、微服務與低代碼場景的創新實踐

專題三&#xff1a;ABAP異常處理與SAP現代技術融合 —— 面向云原生、微服務與低代碼場景的創新實踐 一、SAP技術演進與異常處理的挑戰 隨著SAP技術棧向云端、微服務化和低代碼方向演進&#xff0c;異常處理面臨新場景&#xff1a; Fiori UX敏感度&#xff1a;用戶期望前端友…

DC-DC電路的自舉電容電路原理

在以往的電子產品設計中&#xff0c;我們經常會選型 DCDC 芯片&#xff0c;在選型過程中經常遇到有些DC-DC電路中需要用到自舉電容&#xff0c;本文主要分析自舉電容在DC-DC電路中的原理。 無論同步或者異步整流&#xff0c;經常會看到一個自舉電容&#xff0c;常并聯在DC-DC的…

android studio 開啟無線調試

1、在工具的模擬器點擊下后&#xff0c;會出現下面菜單&#xff1a; 選擇Pair Devices Using Wi-Fi 發現一直在轉圈&#xff0c;并不會連接上&#xff0c;之前在android12的時候&#xff0c;發現一連就上了&#xff0c;現在換成了android14&#xff0c;連不上了。 2、選擇用命令…

Go基礎語法與控制結構

Go基礎語法與控制結構 1. 環境配置與Hello World&#xff08;擴展&#xff09; 安裝指南 # 驗證安裝成功 $ go version # 設置模塊代理&#xff08;中國用戶推薦&#xff09; $ go env -w GOPROXYhttps://goproxy.cn,direct程序解剖 package main // 程序入口包聲明import…

QGIS新手教程:兩種方法創建點圖層(手動添加 + 表格導入),支持經緯度定位與查找

&#x1f30d;QGIS新手教程&#xff1a;兩種方法創建點圖層&#xff08;手動添加 表格導入&#xff09;&#xff0c;支持經緯度定位與查找 本文將手把手教你在 QGIS 中通過兩種方法創建點圖層&#xff0c;并結合經緯度定位、拾取坐標、查找屬性等功能&#xff0c;快速掌握從地…

Doris ClickHouse Greenplum 對比

1. 核心架構對比 Doris &#xff08;https://doris.apache.org/&#xff09; MPP架構 列式存儲支持實時更新&#xff08;Unique Key模型&#xff09;向量化執行引擎兼容MySQL協議 ClickHouse &#xff08;https://clickhouse.com/&#xff09; 分布式列式存儲MergeTree存儲引…

基于python,html,echart,php,mysql,在線實時監控入侵檢測系統

詳細視頻:【基于python,html,echart,php,mysql,在線實時監控入侵檢測系統&#xff0c;需要的可聯系介紹都在所有圖片中。包遠程部署安裝。-嗶哩嗶哩】 https://b23.tv/KHxmE8k

基于51單片機智能垃圾桶—紅外感應自動開關

基于51單片機智能垃圾桶 &#xff08;仿真&#xff0b;程序&#xff0b;原理圖&#xff0b;PCB&#xff0b;設計報告&#xff09; 功能介紹 具體功能&#xff1a; 1.ULN2003驅動步進電機控制打開關閉垃圾桶&#xff1b; 2.一個紅外對管檢測有沒有人&#xff0c;一個紅外對管…

自動涂膠機設計及其在工業生產中的應用研究

摘要 本文詳細探討了自動涂膠機的設計原理、關鍵技術和應用前景。隨著工業自動化水平的不斷提高&#xff0c;自動涂膠機在制造業中的應用日益廣泛。文章首先分析了自動涂膠機的基本工作原理&#xff0c;然后深入研究了其機械結構設計、控制系統設計和視覺定位系統等關鍵技術。…

SQL 語言

SQL概述與數據庫定義 SQL的基本組成 1、數據定義語言。SQL DDL提供定義關系模式和視圖、刪除關系和視圖、修改關系模式的命令。 2、交互式數據操縱語言。SQL DML提供查詢、插入、刪除和修改的命令。 3、事務控制。SQL提供定義事務開始和結束的命令。 4、嵌入式SQL和動態SQL。用…

深度剖析ZooKeeper

1. ZooKeeper架構總覽 ZooKeeper 是一個分布式協調服務&#xff0c;廣泛用于分布式系統中的配置管理、命名服務、分布式鎖和領導選舉等場景。以下是對 ZooKeeper 架構、通信機制、容錯處理、數據一致性與可靠性等方面的詳細剖析。 一、ZooKeeper 主從集群 ZooKeeper 采用 主從…

K8S-statefulset-mysql-ha

需求 實現一個HA mysql&#xff0c;包括1個master&#xff0c;2個slave。在K8S上已statefulset部署。 mysql HA原理 略 K8S環境需要解決的問題 1、由于使用同一個statefulset配置&#xff0c;因此需要考慮master和slave使用不同的cnf文件。 2、不同pod之間文件的傳輸 3、…