Java回调函数详解

article/2025/10/5 17:10:36

什么是回调函数(CallBack)

在编写程序时,有时候会调用许多API中实现实现的函数,但某些方法需要我们传入一个方法,以便在需要的时候调用我们传入进去的函数。这个被传入的函数称为回调函数(Callback function)。
打个比方,有一个餐馆,提供炒菜的服务,但是会让我们选择做菜的方式,我们去这家餐馆里面吃饭,想吃小龙虾,我们告诉他想吃小龙虾后,他询问我们要以何种方式去进行烹饪,是煎炒烹炸还是避风塘。
在上面的例子中,炒菜是我们需要调用的方法,也是API库中所提供的,而炒菜的方式,则是我们去选择的,可以我们自己去定义的。
这个这个就可以回调函数,有库函数(Librart function)来执行我们传入的回调函数(Callback function)这个就可以回调函数,有库函数(Librart function)来执行我们传入的回调函数(Callback function)

在Java中实现回调函数

Callable接口

Interface Callable< V >
在Java1.8官方文档中给出的内容为

  1. 参数类型:V - 回调方法的返回值类型
  2. 已经实现的子接口:DocumentationTool.DocumentationTask, JavaCompiler.CompilationTask
  3. 这个接口位函数试接口
    @FunctionalInterface
    public interface Callable<V>
    
  4. 返回结果可能引发异常,这个接口与Runnable非常相似,这两个接口的设计可以在实例化后,开启新的线程,与Runnable的差别是,Runnable不能返回参数也不能抛出异常。

代码示例

import java.util.Random;
import java.util.concurrent.Callable;public class CallableExample  implements Callable {@Overridepublic Object call() throws Exception {Random generator = new Random();Integer randomNumber = generator.nextInt(5);Thread.sleep(randomNumber * 1000);return randomNumber;}
}@Testpublic void callabledTest(){ExecutorService executorService = Executors.newCachedThreadPool();CallableExample callableExample = new CallableExample();Future<Object> future = executorService.submit(callableExample);executorService.shutdown();try{System.out.println(future.get());}catch (Exception e){e.printStackTrace();}}返回值3

Callback接口

已知实现此接口的类
AuthorizeCallback, ChoiceCallback, ConfirmationCallback, LanguageCallback, NameCallback, PasswordCallback, RealmCallback, RealmChoiceCallback, TextInputCallback, TextOutputCallback

这个接口的实现了会被传递给CallbackHandler,允许有能力的底层服务去回应这个回调方法,已便进行诸如数据检索等信息。回调函数不检索或显示底层安全服务请求的信息。回调实现只是提供了将这些请求传递给应用程序的方法,并且对于应用程序,如果合适的话,可以将请求的信息返回给底层的安全服务。

这个接口是可以自己定义的,定制适用于当前业务的callback接口类型来表示不同类型的回调函数

callback接口的源码


public interface Callback { }## CallbackHandler接口
方法:handle(Callback [] callbacks)
这个方法是用来处理处理callback类型的
官方实例:
```javapublic void handle(Callback[] callbacks)throws IOException, UnsupportedCallbackException {for (int i = 0; i < callbacks.length; i++) {if (callbacks[i] instanceof TextOutputCallback) {// display the message according to the specified typeTextOutputCallback toc = (TextOutputCallback)callbacks[i];switch (toc.getMessageType()) {case TextOutputCallback.INFORMATION:System.out.println(toc.getMessage());break;case TextOutputCallback.ERROR:System.out.println("ERROR: " + toc.getMessage());break;case TextOutputCallback.WARNING:System.out.println("WARNING: " + toc.getMessage());break;default:throw new IOException("Unsupported message type: " +toc.getMessageType());}} else if (callbacks[i] instanceof NameCallback) {// prompt the user for a usernameNameCallback nc = (NameCallback)callbacks[i];// ignore the provided defaultNameSystem.err.print(nc.getPrompt());System.err.flush();nc.setName((new BufferedReader(new InputStreamReader(System.in))).readLine());} else if (callbacks[i] instanceof PasswordCallback) {// prompt the user for sensitive informationPasswordCallback pc = (PasswordCallback)callbacks[i];System.err.print(pc.getPrompt());System.err.flush();pc.setPassword(readPassword(System.in));} else {throw new UnsupportedCallbackException(callbacks[i], "Unrecognized Callback");}}}// Reads user password from given input stream.private char[] readPassword(InputStream in) throws IOException {// insert code to read a user password from the input stream}

通过传入不同的已经实现了Callback接口的实现类,通过分析不同实现类的类型来进行不同的处理,调用形参实现类内的方法(回调)。

一般来说如何使用

在一般工作中,我们都是自己定义接口,写实现类,来进行回调的
自定义的回调函数实例:

这个是Callback接口类,我们一会儿要是用它来创造内部匿名类,来实现这个接口,完成字表的筛选工作

import java.util.List;public interface CallBackInterface {Object process(List<String> list);
}

这个是处理端,通过handler方法,调用传入的CallBackInterface类型中的方法,来对字表进行操作

import lombok.Data;import java.util.ArrayList;
import java.util.List;
@Data
public class WorldListHandler {List<String> stringList = new ArrayList<>();public void execute(CallBackInterface callBackInterface){Object process = callBackInterface.process(stringList);System.out.println(process);}}

使用CallBackInterface接口并实现它,来让Handler来调用它其中的process方法来完成对字表的筛选

    @Testpublic void callableTest2(){List<String> list = Arrays.asList("123","asd","1432","fsd","543","987","tre");WorldListHandler worldListHandler = new WorldListHandler();worldListHandler.setStringList(list);worldListHandler.execute(new CallBackInterface() {@Overridepublic Object process(List<String> list) {List<String> collect = list.stream().filter(e -> e.contains("1")).collect(Collectors.toList());worldListHandler.setStringList(collect);return true;}});worldListHandler.getStringList().forEach(e-> System.out.println(e));}

结果:true为process的返回值,剩下的为我们筛选出字表中包含有1的字符串。
true
123
1432


http://chatgpt.dhexx.cn/article/TiRbrydU.shtml

相关文章

numpy 数据类型转换

参考NumPy 数据类型 - 云社区 - 腾讯云 首先需要导入numpy模块 import numpy as np 首先生成一个浮点数组 a np.random.random(4) dtype的用法 看看结果信息&#xff0c;左侧是结果信息&#xff0c;右侧是对应的python语句 我们发现这个数组的type是float64&#xff0c;…

javascript学习之数据类型转换

⭐️⭐️⭐️ 作者&#xff1a;船长在船上 &#x1f6a9;&#x1f6a9;&#x1f6a9; 主页&#xff1a;来访地址船长在船上的博客 &#x1f528;&#x1f528;&#x1f528; 简介&#xff1a;资深前端开发工程师&#xff0c;专注前端开发&#xff0c;欢迎咨询交流&#xff0…

【Python入门篇】——Python基础语法(数据类型与数据类型转换)

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; Python入门&#xff0c;本专栏主要内容为Python的基础语法&#xff0c;Python中的选择循环语句…

Java八种基本数据类型转换

转换规则&#xff1a; 1、八种基本数据类型当中除布尔类型之外剩下的7种类型之间都可以相互转换。 2、小容量向大容量转换&#xff0c;称为自动类型转换&#xff0c;容量从小到大排序(此处没有布尔类型)&#xff1a; byte < short < int < long < float < doub…

Java数据类型转换

前言 我将在这篇文章中介绍关于Java数据类型转换的知识 一、Java基本数据类型的转换 Java的数据类型转换分两种&#xff0c;一种是由低精度向高精度转换&#xff0c;另一种是由高精度由低精度转换 double float long int short byte 以上数据类型的精度由高到低 1.由低精度向…

C#中的数据类型转换

一、定义 C# 是一门强类型语言&#xff0c;对类型要求比较严格&#xff0c;但是在一定的条件下也是可以相互转换的&#xff0c; 如将 int 型数据转换成 double 型数据。 C#中的数据类型转换分为两种&#xff1a;隐式类型转换以及显式类型转换&#xff1b; 二、数据类型转换方式…

Pandas数据类型转换

Pandas数据类型转换 一、Pandas中的数据类型&#xff1a; 不管是Series还是DataFrame的每一列&#xff0c;都有对应的数据类型。在Pandas中存在以下数据类型。 Pandas dtypePython 类型Numpy类型描述objectstr或者mixed&#xff08;混合类型&#xff09;string_, unicode_, …

C++ 数据类型转换

C 数据类型转换 概述不同类型数据间的转换隐式类型转换强制类型转换自己声明的类型转换转换构造函数 类型转换函数案例应用 概述 在日常的开发中, 我们经常会用到数据类型转换, 所以我们要对数据类型转换有一定的了解. 不同类型数据间的转换 在 C 中, 某些标准类型的数据之间…

C语言数据类型转换详解

数据类型转换就是将数据&#xff08;变量、数值、表达式的结果等&#xff09;从一种类型转换为另一种类型。 自动类型转换 自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换&#xff0c;这种转换不需要程序员干预&#xff0c;会自动发生。 1 . 将一种类型的…

Java的数据类型转换

Java的数据类型转换分为以下的两种&#xff1a; 一、自动类型转换 首先我们要了解自动类型转换是什么&#xff0c;为什么要进行自动类型转换呢&#xff1f; 1.自动类型转换就是类型范围小的变量&#xff0c;可以直接赋值给类型范围大的变量。比如以下代码&#xff1a; 其中int类…

Python 中数据类型转换

前两篇回顾&#xff1a; 第一篇&#xff1a;环境搭建以及运行 Python 的 3 种方式 第二篇&#xff1a;变量及数据类型 今天是 Python 基础系列第三篇&#xff1a;三种数据类型转换形式&#xff08;布尔值转换、字符串转换、数值转换&#xff09;。 一、转为布尔值 一&#xf…

C语言数据类型转换

文章目录 前言一、类型自动转换二、赋值转换三、强制类型转换 前言 C语言中&#xff0c;整型、单精度型、双精度型和字符型数据可以进行混合运算。字符型数据可以得与整型通用。例如&#xff1a; 100′A′8. . 65-2456. 75′a′是一个合法的运算表达式。在进行运算时&#xf…

数据类型的转换

数据类型转换分为两种&#xff1a;自动类型转换和强制类型转换。 一、自动类型转换 ①转换前的数据类型与转换后的类型兼容。 ②转换后的数据类型的表示范围比转换前的类型大。 条件②说明不同类型的数据进行运算时&#xff0c;需先转换为同一类型&#xff0c;然后进行运算。…

数据类型转换

数据类型转换 首先&#xff0c;数据类型一共有6种&#xff0c;分别是字符串、布尔值、数值、空值、未定义和对象。 其中基本数据类型&#xff1a; 1、number数值类型&#xff1a;在JS中所有的数值都是Number类型&#xff0c;包括了整数、浮点数(小数) - 拓展部分&#xff1a…

Java全栈开发

2022年9月6日更新 更多见 个人掘金收藏 写了一个小工具 &#xff0c;可以点击查看和搜索&#xff0c;见这篇博客 JavaFx入门5 - 一个小工具的实现 网上的一些Java全栈开发技术汇总 代码更新 &#xff1a;https://git.code.tencent.com/Java66/openJava.git 目录 比较好的…

java appkey_Java全栈工程师 风袖 appkey

Java全栈工程师 全局性思维 现代项目的开发&#xff0c;需要掌握多种技术。互联网项目&#xff0c;需要用到后端开发、前端开发、界面设计、产品设计、数据库、各种移动客户端、三屏兼容、restFul API设计和OAuth等等&#xff0c;比较前卫的项目&#xff0c;还会用到Single Pag…

Java全栈进阶

https://shq5785.blog.csdn.net/

java全栈前景_Java全栈开发哪个发展前景好

原标题&#xff1a;Java全栈开发哪个发展前景好 全栈和java哪个能更好迎合市场需求&#xff0c;有同学咨询学习哪个在以后前景和工作薪水上能更吃香&#xff0c;首先我们先来了解下Java开发和全栈开发的区别。 全栈开发工程师是指掌握多种技能&#xff0c;能够独立开发应用程序…

Java全栈工程师学习路线(思维导图)送你进大厂

当今软件行业中&#xff0c;Java是最流行的编程语言之一。许多企业都需要Java开发人员来构建和维护应用程序。因此&#xff0c;作为一名Java开发人员&#xff0c;学习Java编程语言和相关技术是至关重要的。下面是一些Java学习路线的建议&#xff1a; 目录 Java 基础Java高级We…

零基础Java全栈教程--全文目录

文章目录 1. 教程结构2. 教程目录2.1 HTML篇2.2 CSS篇2.3 JS篇2.4 Java 语言基础篇2.5 Java Web基础篇2.6 JSJava项目实战篇2.7 jQuery篇2.8 BootStrap篇2.9 Java SSM篇2.10 BootStrapSSM项目实战篇2.11 ESWebpack篇2.12 Vue篇2.13 Element篇2.14 SpringBoot篇2.15 VueSpringBo…