Function 为
com.google.common.base包下接口类:
public interface Function<F, T> {

    @Nullable T apply(@Nullable F input);

    @Override
boolean equals(@Nullable Object object); }

钩子函数用法:

public void backFunc(Function<F,T> func){

  F  f = new F();

  T t =  func.apply(f);

  -- 就得到了想要的T对象了。。。

}

调用钩子函数:

backFunc(   new Function<F,T>() {    public T apply(F f){ return  处理f得到T对象逻辑}      }      );

例子:

Iterable<String> iter = Splitter.on(",").split("1,2,3");
Iterator<Integer> its = Iterators.transform(iter.iterator(), new Function<String, Integer>() {
@Override
public Integer apply(String input) {
int roleid = Integer.parseInt(input);
return roleid;
}
});
ArrayList<Integer> list = Lists.newArrayList(its);
Iterator<Integer> iterator = list.iterator();
System.out.println("roleidList = " + integers);

Iterators.transform()  方法 内容:

public static <F, T> Iterator<T> transform(final Iterator<F> fromIterator,
final Function<? super F, ? extends T> function) {
checkNotNull(function);
return new TransformedIterator<F, T>(fromIterator) {
@Override
T transform(F from) {
return function.apply(from);
}
};
}

TransformedIterator 类:

abstract class TransformedIterator<F, T> implements Iterator<T> {
final Iterator<? extends F> backingIterator; TransformedIterator(Iterator<? extends F> backingIterator) {
this.backingIterator = checkNotNull(backingIterator);
} abstract T transform(F from); @Override
public final boolean hasNext() {
return backingIterator.hasNext();
} @Override
public final T next() {
return transform(backingIterator.next());
} @Override
public final void remove() {
backingIterator.remove();
}
}

上边代码解析:

要想把分割"1,2,3"  得到的List<String> 转化 为 List<Integer>  , 上边首先 利用 google 包下的 Iterators.transform() 方法,这个方法返回TransformedIterator对象,此对象 类是一个抽象类,其中transform为抽象未实现方法,可以利用这个特性进行回调设计,而此类中 next 方法 刚好就调用此抽象接口方法,刚哈就完成了回调操作,而由于next方法只会在 遍历 迭代器时才会调用,所以 上边代码 让人疑惑的是 循环迭代 是在什么位置 开始的,其实 上边代码中 迭代 是在 ArrayList<Integer> list = Lists.newArrayList(its);  这句代码才开始循环迭代,也就是说 这句代码上边的 Iterator<Integer> its 对象 其实仅仅是 Iterators.transform()  方法 中刚new的TransformedIterator 对象,这个刚new的TransformedIterator对象 仅仅做了实现transform抽象方法的操作,其他什么操作都没有做,也就是这个时候根本就还没有迭代,就是说 此 返回给Iterator<Integer> its 对象仅仅是一个 新new的 还没有做实际操作的 TransformedIterator 对象,也就是 List<String> 还没有开始 转换 成List<Integer>,真正 开始转换的是 迭代器真正调用迭代器 next() 的时候,而 ArrayList<Integer> list = Lists.newArrayList(its);   这句代码其实 就调用 list的 addAll方法,参数 是迭代器,结果就是迭代器调用next方法 一个一个的将迭代器元素 加入到list中的,也就是说 将 List<String>转换 成List<Integer>是从Lists.newArrayList(its) 这里开始转换的。

说明: 上边的例子中涉及不仅仅一处钩子回调函数,上边涉及了2处钩子函数,一个是 TransformedIterator tranfrom抽象方法 由迭代器 next方法回调,此next即为钩子函数。还一处 是Function 的 apply方法由 TransformedIterator 实现后的 tranfrom 方法 回调,此 tranform 为钩子函数。

钩子函数 Function类的更多相关文章

  1. javascript中的高阶函数, 和 类定义Function, 和apply的使用

    参考: http://www.cnblogs.com/delin/archive/2010/06/17/1759695.html js中的类, 也是用function关键字来定义的: function ...

  2. form组件类 钩子函数验证

    # 全局钩子 def clean(self): pwd = self.cleaned_data.get("password") re_pwd = self.cleaned_data ...

  3. 【Mocha.js 101】钩子函数

    前情提要 在上一篇文章<[Mocha.js 101]同步.异步与 Promise>中,我们学会了如何对同步方法.异步回调方法以及 Promise 进行测试. 在本篇文章中,我们将了解到 M ...

  4. php 钩子函数原理 解析

    目前对钩子的理解:<转载:http://www.cnblogs.com/del/archive/2008/02/25/1080825.html> 譬如我们用鼠标在某个窗口上双击了一次, 或 ...

  5. HOOK钩子 - 钩子函数说明

    翻译参考自MaybeHelios的blog: http://blog.csdn.net/maybehelios/ 通过SetWindowsHookEx方法安装钩子,该函数指定处理拦截消息的钩子函数(回 ...

  6. 用Delphi实现Windows的鼠标钩子函数

    Delphi是基于PASCAL语言的Windows编程工具,功能十分强大.然而在Delphi的帮助文件中,对Windows API函数的说明沿袭了 VC 的格式,和VC一样,对很多API函数的用法没有 ...

  7. Vue的钩子函数[路由导航守卫、keep-alive、生命周期钩子]

    前言 说到Vue的钩子函数,可能很多人只停留在一些很简单常用的钩子(created,mounted),而且对于里面的区别,什么时候该用什么钩子,并没有仔细的去研究过,且Vue的生命周期在面试中也算是比 ...

  8. js面向对象设计之function类

    本文仅探讨如何合理的使用 function 在 javascript中实现一个面向对象设计的类.总所周知,javascript 并不能实现一个真正意义上的类,比如 protect 比如 函数重载.下面 ...

  9. PHP中钩子函数的实现与认识

    PHP中钩子函数的实现与认识 分类:PHP编程  作者:rming  时间:2014-09-21 假如有这么一段程序: function fun(){ fun1(); fun2(); }   首先程序 ...

随机推荐

  1. 【问题记录】记一次ConnectionTimeout问题排查

    最近做性能测试时,发现连接第三方系统时会有约1%的交易提示如下错误 nested exception is org.apache.commons.httpclient.ConnectTimeoutEx ...

  2. 关于CORS(跨域资源共享)的几个http请求头小实验

    对几种与跨域相关的请求头做一个总结 关于跨域可以看:9 种常见的前端跨域解决方案(详解) 看完后可以配合我的代码做些实验,看看注释掉某个响应头会发生什么,整体代码会在最后贴出 跨域简单请求 需要在服务 ...

  3. MySQL笔记(5)-- SQL执行流程,MySQL体系结构

    MySQL的体系结构,可以清楚地看到 SQL 语句在 MySQL 的各个功能模块中的执行过程:Server层包括连接层.查询缓存.分析器.优化器.执行器等,涵盖MySQL的大多数核心服务功能,以及所有 ...

  4. STL篇--list容器

    list容器: 1.list 容器 的本质就是双向环形链表,最后一个节点刻意做成空节点,符合容器的左闭右开的原则2.list 的迭代器 是一个智能指针,其实就是一个类,通过操作符重载模拟各种操作(++ ...

  5. VScode+phpStudy搭建php代码调试环境

    一.安装Visual Studio Code 官网:https://code.visualstudio.com/ 下载安装包后,按照默认安装即可 安装中文语言环境 点击左侧工具栏的 extension ...

  6. 谷歌出品EfficientNet:比现有卷积网络小84倍,比GPipe快6.1倍

    [导读]谷歌AI研究部门华人科学家再发论文<EfficientNet:重新思考CNN模型缩放>,模型缩放的传统做法是任意增加CNN的深度和宽度,或使用更大的输入图像分辨率进行训练,而使用E ...

  7. 干净直接安装+PS下载

    PS CS6 https://www.cr173.com/soft/247727.html 直接一键安装,很方便干净. 不要去华军软件下,广告浪费时间. 链接:https://pan.baidu.co ...

  8. redis++:Redis的两种持久化 RDB 和 AOF

    Redis持久化备份数据的方式有两种:RDB(Redis DataBase) . AOF(Append Only  File). RDB 什么是RDB: 在指定时间间隔内,将内存中的数据集快照写入磁盘 ...

  9. Jmeter 注册多个用户 之 CSV Data set Config

    1. 打开Jmeter,新建一个测试计划 > 新建线程组> 创建一个Http 请求 2. 创建一个信息头管理器 > content-Type   application/json; ...

  10. 深入理解Java AIO(三)—— Linux中的AIO实现

    我们调用的Java AIO底层也是要调用OS的AIO实现,而OS主要也就Windows和Linux这两大类,当然还有Solaris和mac这些小众的. 在 Windows 操作系统中,提供了一个叫做 ...