文章来源:csdn 作者:wangfengsdu

经常听到回调函数(callback function)这个概念, 所谓回调函数,就是指这个函数先在某处注册,而它将在稍后某个需要的时候被调用。比如在利用SDK 进行Windows编程的时候,我们需要注册一个WNDCLASS类,这个类中有这样一个参数 lpfnWndProc, 要进行消息处理,我们就要用处理消息的函数的指针给它赋值。消息处理函数什么时候被调用的?我们没有显式地在程序中看到啊。是OS调用的。  这是SDK的试验方式,当然用的是过程式的语言C,可以通过传递函数的指针实现。

C++中怎么来实现呢?当然,C++兼容C,用函数指针就可以。  同时C++又提供了面向对象的机制,可不可以有不同的实现机制呢?  当然! STL 中的functor(Function object)就可以用到回调上。  比如对一个存放int数据的vector进行递减排序的话,我们可以这样进行。

sort(vec.begin(),vec.end(),greater());

greater()

就是我们传递的一个匿名对象,它重载了函数调用运算符“()”。我们没有显式地调用这个对象里面提供的函数,sort函数对对象里面的函数进行call back。

Java中要实现类似functor的功能,应该怎么办呢?Command模式可以帮上忙。Command模式看起来很简单,只要把command封装到一个接口中就可以。Command模式是回调机制的一个面向对象的替代品。

比如 java.io 中已经定义好的一个接口

public interface FilenameFilter {

boolean accept(File dir, String name);

}

这个FilenameFilter就是Command,实现Command的类就是ConcreteCommand。这个接口所声明的操作 "accept" 就是看看目录dir中的文件name是否满足某种要求,如果满足就返回true,否则就返回false。这个要求是什么呢?你要对这个接口进行实现。比如我想看看这个文件的名称包含不包含指定的字符串,那么就可以定义下面的类:

class DirFilter implements FilenameFilter {

private String afn;

public DirFilter(String afn){

this.afn = afn;

}

public boolean accept(File dir, String name){

String f = new File(name).getName();

return f.indexOf(afn) != -1;

}

}

怎么样使用它呢?File类中有这样一个方法

public String[] list(FilenameFilter filter)

因此,我们就可以这样做了:

File file = new File(".");

String[] list = file.list(new DirFilter("wf"));

得到的list就是一个当然目录中所有包含字符串"wf"的文件名称的字符串数组。怎么样,看起来是不是和C++中的functor差不多呢?

java中function实现_Java中的functor实现相关推荐

  1. java函数式编程入口_Java中的函数式编程

    前言 JDK8引入的Lambda表达式和Stream为Java平台提供了函数式编程的支持,极大地提高了开发效率.本文结合网络资源和自身使用经验,介绍下Java中的函数式编程 Java中的函数式编程 出 ...

  2. java 调用matlab函数_java中调用Matlab的函数+注意事项

    一.matlab版本必须支持java 在command 模式下面运行deploytool,如果支持该命令即可使用 二.matlab中function的书写 %定义一个函数operation(a,b), ...

  3. java变量存储位置_java 中变量存储位置的区别

    [原文] 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量 ...

  4. java可以多重继承吗_Java中的多重继承与组合vs继承

    java可以多重继承吗 有时我写了几篇有关Java继承,接口和组成的文章. 在这篇文章中,我们将研究多重继承,然后了解组成优于继承的好处. Java中的多重继承 多重继承是创建具有多个超类的单个类的能 ...

  5. java中有没有栈_Java中堆和栈有什么区别

    stack 和 heep 都是内存的一部分stack 空间小,速度比较快, 用来放对象的引用heep 大,一般所有创建的对象都放在这里.栈(stack):是一个先进后出的数据结构,通常用于保存方法(函 ...

  6. java 静态资源变量_Java中读取配置文件中的内容,并将其赋值给静态变量的方法...

    项目开发中某个功能需要抽取成方法写成一个工具类,提供给别人使用.写过工具类的人都知道,工具类中的方法一般都是静态方法,可以直接使用类名点方法名调用, 使用很方便,比如判断某个对象是否为空的方式Obje ...

  7. java 删除list元素_JAVA中循环删除list中元素的方法总结

    印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天在使用时发现报错了,然后去科普了一下,再然后发现这是一个误区.下面就来讲一讲..伸手党可直接跳至文末 ...

  8. java和equals区别_JAVA中==与equals的区别

    equals如果没有被重写的话,和==的作用是一样的,都是判断两个对象引用是否指向同一个地址.一般重写了equals()方法就表示比较它们"实际意义上相等",比较的是内容,而不是引 ...

  9. java为什么要初始化_JAVA中到底要怎么样初始化

    Java中的变量作用范围: 1. 类的属性,或者叫值域 2. 方法里的局部变量 3. 方法的参数 对于第一种变量,Java虚拟机会自动进行初始化.如果给出了初始值,则初始化为该初始值.如果没有给出,则 ...

最新文章

  1. Java学习笔记(八)--字符串生成器
  2. Luogu4022 CTSC2012 熟悉的文章 广义SAM、二分答案、单调队列
  3. 腾讯地图api_数据库API接口的类型及应用场景
  4. Linux环境中Qt程序的手工发布
  5. 轨迹跟踪主要方法_DELMIA教程:基于指令形式的机器人TCP轨迹局部跟踪方法
  6. VMware的宿主模式
  7. android x86 uc,android x86 固件定制
  8. WSDM2021 | 多交互注意力网络用于CTR预估中细粒度特征学习
  9. Q2 Spring Boot自动配置原理(ok)
  10. 【学员管理系统】0x01 班级信息管理功能
  11. linux keepalived 脚本,Linux下安装Keepalived及原理分析
  12. 最简单的视频编码器:基于libvpx(编码YUV为VP8)
  13. C语言和三菱plc通讯,三菱PLC的通讯与编程,附实际案例
  14. 中学生读《皮囊》有感相关体会4300字[图]
  15. 如何科学管理你的密码
  16. PHP函数array_intersect_assoc
  17. matlab乖离率计算,BIAS乖离率指标计算公式
  18. MMX、SSE、AVX等SIMD指令集说明
  19. 2021年 最新 多阶段构建dockerfile实现java源码编译打jar包并做成镜像
  20. springboot+食堂预约订餐小程序 毕业设计-附源码221554

热门文章

  1. 【Hibernate】getHibernateTemplate与getSession的区别以及优缺点
  2. Amazon DynamoDB 概览
  3. mac 或linux上 pip 不支持ssl的问题
  4. [华为机试练习题]5.IP地址推断有效性
  5. Android经常使用的五种弹出对话框
  6. 为什么有时候 php 没有写闭合标签结束符?
  7. 《高新技术企业知识产权管理》阅读笔记
  8. struts 模块化开发学习
  9. 转载的SSO文章,很基础
  10. Centos最小化装机网络问题