1. 程式人生 > >Java 回撥函式(傳統方法和lambda方法)-一個例子秒懂

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原理,以及CallableFutureTask通過機制建立可監控的執行緒

回撥的概念會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++中回撥函式初探    簡介   對於很多初學者來說,往往覺得回撥函式很神祕,很想知道回撥函式的工作原理。本文將要解釋什麼是回撥函式、它們有什麼好處、為什麼要使用它們等等問題,在開始之前,假設你已經熟知了函式指標。   什麼是回撥函式?   簡而言之,回撥函