Java 回撥函式(傳統方法和lambda方法)-一個例子秒懂
背景:
想寫一個工具類 Tool.java ,其中方法 public void readOneLine() 負責一行一行地讀檔案,然後根據不同的業務,對每一行進行不同處理。最後輸出到檔案 out.txt
那麼問題來了,根據不同的業務,進行不同處理 怎麼實現?
自然而然想到,每個業務有一個對讀取的一行的處理方法 public void 業務名(),我們把方法作為引數傳入 public void readOneLine(業務名()),比如:
業務A: readOneLine(直接輸出每一行()) 業務B: readOneLine(每一行全部大寫後輸出()) 業務C: readOneLine(輸出每一行的第一個單詞()) ......
很可惜,java 7不支援這樣的語法,也許java 8 的 lambda 表示式可以?這不在今天討論的範圍裡
java 7 要實現這樣的功能需要通過回撥函式
回撥函式 - A類中呼叫B類中的某個方法methodB(),然後 methodB() 中反過來呼叫A類中的methodA()。methodA()這個方法就叫回調函式
一個同步回撥函式的例子
回撥函式介面,這個介面是必須的嗎?
是。不僅為了符合面向介面程式設計的規範
事實上,呼叫方將會 Override 介面的 具體業務邏輯(),達到傳函式給被呼叫方的目的。
//回撥函式介面及方法
public interface 業務邏輯 {
public void 具體業務邏輯();
}
public class Tool {
private 業務邏輯 yewuluoji; //私有介面成員
public void setYewuluoji(業務邏輯 yewuluoji){
this.yewuluoji = yewuluoji;
}
public void 工具類邏輯() {
//讀檔案
while(每一行){
yewuluoji.具體業務邏輯();
}
}
}
測試類:
public class MainClass {
public MainClass() {
}
public static void main(String[] args) {
Tool tool = new Tool();
//傳入 匿名實現類,包含具體業務邏輯
tool.setCallback(new 業務邏輯{
@Override
public void 具體業務邏輯() {
//輸出每一行的第一個單詞
}
});
tool.工具類邏輯(); //此方法中回撥匿名類的具體業務邏輯(),即:輸出每一行的第一個單詞
}
}
java 8 lambda方式傳函式(僅僅是語法糖?)
匿名型別最大的問題就在於其冗餘的語法。有人戲稱匿名型別導致了“高度問題”(height problem):比如前面ActionListener的例子裡的五行程式碼中僅有一行在做實際工作。
lambda表示式是匿名方法,它提供了輕量級的語法(語法糖?),從而解決了匿名內部類帶來的“高度問題”。
下面是一些lambda表示式:
(int x, int y) -> x + y
() -> 42
(String s) -> { System.out.println(s); }
lambda表示式的語法由引數列表、箭頭->(等價於return)和函式體組成。函式體既可以是一個表示式,也可以是一個語句塊:
lambda表示式也會經常出現在巢狀環境中,比如說作為方法的引數。為了使lambda表示式在這些場景下儘可能簡潔,我們去除了不必要的分隔符。不過在某些情況下我們也可以把它分為多行,然後用括號包起來,就像其它普通表示式一樣。
下面是一些出現在語句中的lambda表示式:
FileFilter java = (File f) -> f.getName().endsWith("*.java");
String user = doPrivileged(() -> System.getProperty("user.name"));
new Thread(() -> {
connectToService();
sendNotification();
}).start();
相關推薦
Java 回撥函式(傳統方法和lambda方法)-一個例子秒懂
背景: 想寫一個工具類 Tool.java ,其中方法 public void readOneLine() 負責一行一行地讀檔案,然後根據不同的業務,對每一行進行不同處理。最後輸出到檔案 out.txt 那麼問題來了,根據不同的業務,進行不同處理 怎麼實現?
[置頂] java 回撥函式學習(監聽器模式)
回撥就是把函式指標做為引數傳入 如函式A 做為引數傳入函式B 由B函式決定何時 何地 呼叫函式A 經典形象的說明了回撥函式(javascript中經常這麼用) function A(){ } function B(A) { ... ... A(); } 但是在JAVA中不允許將方法作為引
java 回撥的 基本使用場合 和 講解 以及 HttpUtil邏輯封裝
回撥 邏輯圖 HttpCallbackListener 介面,也就是 耗時操作結束後返回給 呼叫方 的通道 public interface HttpCallbackListener { void onFinished(String response); voi
JS中回撥函式(一)
一.前奏 多用在使用 js 寫元件時,尤其是元件的事件很多都需要回調函式的支援 假設 A是回撥函式,B是呼叫者,B引數裡一個是指向A的函式指標,即回撥A,同時另外的引數傳遞給A作為引數 二.JS中函式可作為引數傳遞,甚至在另一個函式內部返回 一旦作為引數
java回撥原理,以及Callable和FutureTask通過回撥機制建立可監控的執行緒
回撥的概念會JS的人應該都能理解。 回撥分非同步回撥,同步回撥。但是同步回撥其實沒什麼意義。都同步了,那麼直接等那邊執行完了,這邊再執行就可以了,沒必要通過回撥。我們說的回撥主要是講非同步回撥。用於兩個執行緒甚至兩個系統之間互動呼叫。 例如我在A類的方法funa()中,要呼叫B類的方法fun
java回撥函式詳解
宣告:部落格參考於https://www.cnblogs.com/yangmin86/p/7090882.html,謝謝哥們 回撥函式:是指在A類執行程式碼時,呼叫了B類中的方法,但B類中的方法執行了A類中的方法。 example: 1、Boss.java(Boss類中執行程式碼,呼叫了Emp類的doP
JavaScript使用回撥函式(二)
AJAX - onreadystatechange 事件 菜鳥教程地址http://www.runoob.com/ajax/ajax-xmlhttprequest-onreadystatechange.html/*不使用回撥函式*/<!DOCTYPE html&g
深入淺出回撥函式(知乎上看到最好的回答)
回撥方法介紹之中國好室友篇(Java示例)前言在Java社群的各種開源工具中,回撥方法的使用俯拾即是。所以熟悉回撥方法無疑能加速自己對開源輪子的掌握。網上搜了一些文章,奈何對回撥方法的介紹大多隻停留在什麼是回撥方法的程度上。本篇文章嘗試從回撥方法怎麼來的、為什麼要使用回撥方法以及在實際專案中如何使用等方面來介
將類的成員函式作為回撥函式(外一篇:友元函式)
問題的提出 我們已知道類具有封裝和資訊隱藏的特性。只有類的成員函式才能訪問類的私有成員,程式中的其他函式是無法訪問私有成員的。非成員函式可以訪問類中的公有成員,但是如果將資料成員都定義為公有的,這又破壞了隱藏的特性。另外,應該看到在某些情況下,特別是在對某些成員函式多次呼叫時,由於引數傳遞,型別檢查和安全性
java 回撥函式詳解
在C或者C++中回撥函式的定義: 程式在呼叫一個函式時,將自己的函式的地址作為引數傳遞給程式呼叫的函式時(那麼這個自己的函式稱回撥函式) Java中沒有指標,不能傳遞方法的地址,一般採用介面回撥實現:把實現某一介面的類建立的物件的引用賦給該介面宣告的介面變
ajax的回撥函式(done,fail,always)
直接上程式碼 <!DOCTYPE html> <html> <head> <meta charset="utf-8"><title>ajax</title><script type="te
回撥函式(轉)
#include<stdio.h> // 方法指標的格式為:int(*ptr)(char *p) 即:返回值(指標名)(引數列表) typedefint (*CallBackFun)(char *p); // 為回撥函式命名,型別命名為 CallBackFun
【FreeRTOS】小白進階之任務如何共用FreeRTOS軟體定時器回撥函式(二)
介紹兩個定時器任務如何通過定時器 handle 共用一個回撥函式。 1、標頭檔案宣告和函式定義 #include "FreeRTOS.h" #include "task.h" #include "t
Java 回撥函式callback 用法
1.定義回撥函式介面裡面包含一個方法public interface CallBack { public void execute(); }2.定義回撥函式的實現 public class Bo
WebService、Ajax與回撥函式(一)
本例項演示藉助WebService、Ajax技術和回撥函式,從MSSQL資料庫中獲取所需資料,並用JavaScript語言將資料結果顯示到網頁地圖上。 1、WebService (1)在工具箱的Ajax Extentions下面找到ScriptM
ROS 類內如何使用成員函式作為subscribe的回撥函式(this指標)
ros::Subscriber sub = n.subscribe("chatter", 1000, &Listener::callback, &listener); 使用類內函式時,將第四個引數替換成this: ros::Subscriber sub
java回撥函式
兩種回撥 1、同一程序中,被回撥方法所屬類需要在呼叫‘呼叫回撥方法’的類的方法時將自己傳過去 public class A{ public void methodA(){ methodB(this) } public void
回撥函式(二)
回撥函式作用: 對於很多初學者來說,往往覺得回撥函式很神祕,很想知道回撥函式的工作原理。本文將要解釋什麼是回撥函式、它們有什麼好處、為什麼要使用它們等等問題,在開始之前,假設你已經熟知了函式指標。 (1)什麼是回撥函式? 簡而言之,回撥函式就是一個通過函式指標呼叫的函式。如果你把函式的指標(地址)作為引
淺談C/C++回撥函式(Callback)& 函式指標
摘要:回撥函式就是一個通過函式指標呼叫的函式。如果你把函式的指標(地址)作為引數傳遞給另一個函式,當這個指標被用來呼叫其所指向的函式時,我們就說這是回撥函式。回撥函式不是由該函式的實現方直接呼叫,而是在特定的事件或條件發生時由另外的一方呼叫的,用於對該事件或條件進行響應。
什麼是回撥函式,如何定義和實現一個類的成員函式為回撥函式(轉)
C/C++中回撥函式初探 簡介 對於很多初學者來說,往往覺得回撥函式很神祕,很想知道回撥函式的工作原理。本文將要解釋什麼是回撥函式、它們有什麼好處、為什麼要使用它們等等問題,在開始之前,假設你已經熟知了函式指標。 什麼是回撥函式? 簡而言之,回撥函