当前位置: 首页 > news >正文

java func_Java通过匿名类来实现回调函数实例总结

在C语言中,函数名可以当做函数指针传递给形参从而实现回调

void f1() { printf("f1()\n"); }

void f2() { printf("f2()\n"); }

void f3() { printf("f3()\n"); }

void do_func(void(*f)()) { f(); }

int main()

{

do_func(f1);

do_func(f2);

do_func(f3);

}

在C++11中,实现回调还可以通过函数模板和lambda表达式的方式

template

void do_func(Func f) { f(); }

int main()

{

do_func([]() { printf("f1()"); });

do_func([]() { printf("f2()"); });

do_func([]() { printf("f3()"); });

}

而假如回调函数的代码实现较为复杂,且具有重用价值,lambda表达式这种一次性的方案就不太适合,在C++11之前,是通过函数对象来实现的。函数对象说白了就是一个类的普通对象,只不过C++可以重载括号运算符,导致调用类的对象的operator()方法时,就像调用函数一样自然。

而分析本质,其实回调函数就是一种函数签名(若干个输入参数、一个输出参数)的规范,java虽不存在函数声明,但是java可以用接口来强制规范。

interface Funcable {

void Func();

}

这样只要实现了该接口的类,都有一个函数签名和void Func()一致的成员函数(嘛,还是不习惯方法(method)这种叫法),于是只需要把实现了该接口的类的对象传入函数中,然后在函数中调用该对象的Func()方法即可

class F1 implements Funcable {

@Override

public void Func() {

System.out.println("f1()");

}

}

public class Test {

public static void do_func(Funcable funcable) {

funcable.Func();

}

public static void main(String[] args) {

do_func(new F1());

}

}

这里节省代码量,就不把类F2、F3给写出来了。并且利用java的匿名类可以节省代码,类似于lambda表达式

do_func(new Funcable() {

@Override

public void Func() {

System.out.println("f2()");

}

});

说到lambda表达式,它是可以捕获外部变量的,在Java这种方式还可以通过匿名内的匿名构造函数来显式捕获外部的变量

String msg = "f3()";

do_func(new Funcable() {

String _msg;

{

_msg = msg;

}

@Override

public void Func() {

System.out.println(_msg);

}

});

这种做法就很像lambda表达式了,因为匿名类的匿名构造函数是只能以外部变量为构造参数的,相当于lambda表达式的“捕获”,对应C++的lambda表达式写法就是

std::string msg = "f3()";

do_func([&msg]() { std::cout << msg << std::endl; });

java8也有lambda表达式了,因此可以写成这样

do_func(() -> { System.out.println(msg); });

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助~如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持!

相关文章:

  • Java关系表达式x y_Java正则逻辑运算符[X|Y]匹配
  • java将五元换成1元5角_C,一个代码来获得一笔钱转换成四分之一,硬币,镍币,便士[关闭]...
  • java 对方 GBK 乱码_【转】Java编码与乱码---GBK与UTF-8之间的转换
  • mySQL表变量和临时表的区别_SQL Server表变量和临时表的区别
  • 将java类的包注册到map中_java hashmap对象当实参是出现”java:11: 错误: 无法将类 Role中的构造器 Role应用到给定类型;”?...
  • JAVA不是主方法怎么输出_java主方法如何调用非静态方法
  • php显示缩小的图片代码,php等比例缩放图片及剪切图片代码分享
  • php代码转换工具,推荐几款格式化工具以及代码转换工具
  • img标签 中的php图片大小,html中关于img标签以及改变图片尺寸的详解(图)
  • php csv 源码 下载,[PHP] 使用php生成下载csv文件
  • java 去掉 u00a0,UTF-8编码中的特殊空格之C2 A0 - NO-BREAK SPACE
  • java里函数式表达式,Java8 Lambda表达式 和 函数式编程 原理详解
  • 易语言与php加密AES,易语言调用openssl库实现aes cbc/cfb 256加密
  • linux安装php json拓展,Linux PHP增加JSON支持
  • php ajax实现图片预览,ajax怎么实现图片的预览上传以及查看缩略图
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【技术性】Search知识
  • Android开源项目规范总结
  • canvas绘制圆角头像
  • gitlab-ci配置详解(一)
  • JavaScript中的对象个人分享
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Linux链接文件
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • vue.js框架原理浅析
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 彻底搞懂浏览器Event-loop
  • 代理模式
  • 第十八天-企业应用架构模式-基本模式
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 京东美团研发面经
  • 前端存储 - localStorage
  • 写代码的正确姿势
  • 一天一个设计模式之JS实现——适配器模式
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • C# - 为值类型重定义相等性
  • 回归生活:清理微信公众号
  • ​插件化DPI在商用WIFI中的价值
  • ![CDATA[ ]] 是什么东东
  • #图像处理
  • #在 README.md 中生成项目目录结构
  • (ros//EnvironmentVariables)ros环境变量
  • (vue)页面文件上传获取:action地址
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (算法)求1到1亿间的质数或素数
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)Oracle存储过程编写经验和优化措施
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .net core 连接数据库,通过数据库生成Modell
  • .NET LINQ 通常分 Syntax Query 和Syntax Method