在Java8之后,当定义的接口中只有一个函数,可以用作函数指针。

比如,定义一个输入参数为String返回String的函数。

public interface TestFuncPoint {String run(String str);
}

那么如何使用呢?

比如,我们需要定义一个函数,接受一个函数指针,并使用这个函数指针。

public interface TestFuncPoint {String run(String str);
}// 定义一个类,在runFunc中使用这个函数指针
public class Demo {void runFunc(TestFuncPoint funcPoint) {System.out.println(funcPoint.run("Ted"));}
}public class Main {public static void main(String[] args) {Demo d = new Demo();// 将函数的具体实现,传入runFunc中d.runFunc(Main::funcImpl);}// 定义具体函数public static String funcImpl(String str) {return "hi " + str;}
}

这样操作就可以非常灵活的,将之前只能通过反射实现的业务逻辑,做的更高效、清楚。


比如有这样一个业务需求。根据用户选择的功能,运行某一函数。入参是一个String类型的功能名称(不一定是函数名)。

如果按照没有函数指针的话,我们需要反射实现。

public class Demo {Map<String, String> funcMap = new HashMap<>();public Demo() {init();}void init() {funcMap.put("叫我爸爸", "callBaBa");funcMap.put("叫我妈妈", "callMaMa");funcMap.put("叫我爷爷", "callYeYe");}public void call(String funcName) {// 通过反射获取具体实现函数String methodName = funcMap.get(funcName);if (methodName != null) {try {Method method = Demo.class.getMethod(methodName);method.invoke(this);} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {e.printStackTrace();}}}public void callBaBa() {System.out.println("爸爸!");}public void callMaMa() {System.out.println("妈妈!");}public void callYeYe() {System.out.println("爷爷!");}
}public class Main {public static void main(String[] args) {Demo demo = new Demo();// 模拟用户输入了"叫我爸爸"demo.call("叫我爸爸");}
}

如果有函数指针的话,就可以使逻辑更加清楚,执行效率更快。

public interface TestFuncPoint {void run();
}public class Demo {Map<String, TestFuncPoint> funcMap = new HashMap<>();public Demo() {init();}void init() {// 这里的值是指向具体函数的指针funcMap.put("叫我爸爸", this::callBaBa);funcMap.put("叫我妈妈", this::callMaMa);funcMap.put("叫我爷爷", this::callYeYe);}public void call(String funcName) {TestFuncPoint method = funcMap.get(funcName);if (method != null) {method.run();}}public void callBaBa() {System.out.println("爸爸!");}public void callMaMa() {System.out.println("妈妈!");}public void callYeYe() {System.out.println("爷爷!");}
}public class Main {public static void main(String[] args) {Demo demo = new Demo();demo.call("叫我爸爸");}
}

同样的,也可以实现事件效果。

比如,按下一个按钮之后,打印按下了按钮

public interface Event {void run();
}public class Demo {private Event event;public void submitEvent(Event event) {this.event = event;}void raiseEvent() {this.event.run();}
}public class Main {public static void main(String[] args) {Demo d = new Demo();// 订阅事件d.submitEvent(Main::buttonPressed);// 模拟事件发生d.raiseEvent();}public static void buttonPressed() {System.out.println("按下了按钮");}
}

Java实现函数指针相关推荐

  1. java map函数指针_C 函数指针与回调函数

    关于回调函数的一点思考 在 A 函数中将参数与 C 函数传递给 B 函数,B函数调用 C 函数:B 函数调用的动作称为回调,C 函数称为回调函数. 举栗 #include // 回调函数a void ...

  2. swig c java gemt,SWIG C函数指针和JAVA

    我在C中有一些代码,其中一个方法有一个函数指针作为参数.我正在尝试在我的 Android应用中使用C代码. 我决定使用SWIG来完成生成我需要的java文件的所有工作.一切都适用于常规函数(没有函数指 ...

  3. java跨函数跳转_C语言中将绝对地址转换为函数指针以及跳转到内存指定位置处执行的技巧...

    1.方法一 要对绝对地址0x100000赋值,我们可以用 (unsigned int  * ) 0x100000 = 1234; 那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做? ...

  4. java unsafe获取指针_【实战Java高并发程序设计 1】Java中的指针:Unsafe类

    是<实战Java高并发程序设计>第4章的几点. 如果你对技术有着不折不挠的追求,应该还会特别在意incrementAndGet() 方法中compareAndSet()的实现.现在,就让我 ...

  5. Java回调函数的理解

    所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数.例如Win32下的窗口过程函数就是一个典型的回调函数.一般说来,C ...

  6. Android JNI编程(六)——C语言函数指针、Unition联合体、枚举、Typedef别名、结构体、结构体指针...

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:函数指针 1.函数指针顾名思义就是定义一个指针变量指向一个函数,和一级指 ...

  7. 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )

    文章目录 I . 调用 Java 方法流程 II . 获取 jclass 对象 ( GetObjectClass ) III . 获取 jclass 对象 ( FindClass ) IV . JNI ...

  8. java 垃圾回收 指针_Java 和 C++ 垃圾回收之间的差别

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 1.指针 JAVA语言让编程者无法找到指针来直接访问内存无指针,并且增添了自动的内存管理功能,从而有效地防止了c/c++语言中指针操作失误,如野指针所造成 ...

  9. java 自定义函数的调用_Java/Android中的函数调用回调函数自定义回调函数

    在做Android自定义控件时遇到要自定义回调函数的问题,想想自己还暂时没有那么精深的技术,赶紧返过头回来再重新研究Java中回调函数的问题.然而不幸的是,网上太多杂乱的帖子和博客都是转来转去,而且都 ...

  10. java8的函数指针

    转载自  java8的函数指针 这段时间 项目实在是太紧了,没有时间写博客啊.java模式的文章还没有写完,后期在写吧. 最近项目中大量的使用到了远程调用以及回调.是采用反射的方式实现的.担心到大量的 ...

最新文章

  1. LWIP裸机环境下实现TCP与UDP通讯
  2. SQL Server Management Studio 过期无法使用解决办法
  3. python如何下载安装spacy_使用pip安装Spacy时出错
  4. nagios   IO监控 Error executing iostat command
  5. Android 自动化测试 常用的命令----随时更新
  6. LINUX用C检查文件的大小的代码
  7. java框架有哪几种,java权限框架有几种?常见的权限框架分享
  8. matlab输出动态gif图片
  9. 帆软报表开发之基础操作
  10. 自主导航系列21-layered论文阅读
  11. Python中abs()与fabs()的区别
  12. linux rm、rm -f、rm -r的区别
  13. 画中画视频怎么制作?学会这招,让你成为短视频高手!
  14. 寻找真实IP-子域名查找
  15. 多源异构作物组学数据融合方法研究——以高粱为例
  16. Wince 困难中前行 晚饭的时候可以看下夕阳
  17. java pdf工具类_Java PDF工具类(一)| 使用 itextpdf 根据PDF模板生成PDF(文字和图片)...
  18. SwiftUI中应用Hero动画(Hero Animation)时一些需要填的坑
  19. 请访问豆瓣电影网站,爬取4~10部电影信息(电影名、导 演、演员、海报url链接,预报片视频链接),并结合GUI界面展现电影信息,并可以根据选择的电影名, 下载指定预告片视频到本地并显示预告片。GUI
  20. 132计算机毕业设计

热门文章

  1. 品优购-01分布式框架-Dubbox
  2. phpstudy安装及简单使用教程
  3. Mac安装numpy
  4. Matplotlib - 中文字体
  5. EXPRESS语言与IFC体系
  6. 计算机组成与系统结构第二版答案
  7. 利用SQL对拍拍贷数据进行逾期分析
  8. 12306分流抢票软件 v1.13.21官方版 -抢票神器
  9. windows网络编程头文件注意事项
  10. html静态网页设计实训总结,网页设计实训心得体会范文