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. Jmeter中使用MD5方法

    在现在这家公司做测试的项目有用到鉴权,token的生成方式有使用到md5,具体的请求url和入参就不方便透露,讲一讲使用方法吧! 自带的Jmeter插件中是没有这个md5的所以,我们可以 (1)打开选 ...

  2. 深夜,我用python爬取了整个斗图网站,不服来斗

    QQ.微信斗图总是斗不过,索性直接来爬斗图网,我有整个网站的图,不服来斗. 废话不多说,选取的网站为斗图啦,我们先简单来看一下网站的结构 网页信息 从上面这张图我们可以看出,一页有多套图,这个时候我们 ...

  3. [Docker01] The Docker Road

    The Docker Road Docker是什么? Docker是docker容器为资源分隔和调度的基本单位,封装整个软件运行时环境,为开发者和系统管理员设计的,用于构建,发布和运行分布式应用的平台 ...

  4. 李飞飞团队最新论文:基于anchor关键点的类别级物体6D位姿跟踪

    6-PACK: Category-level 6D Pose Tracker with Anchor-Based Keypoints 论文地址: 6-PACK: Category-level 6D P ...

  5. CF1324B Yet Another Palindrome Problem 题解

    原题链接 CF 127个测试点,好评 简要题意: 多组数据,问数组中是否有长度 \(\geq 3\) 的回文子序列. 我们需要找到本质. 题目不让我们求这个长度,只让我们判断,这是为什么呢? 如果答案 ...

  6. 【2019南昌网络赛】B-Fire-Fighting Hero

    题目链接 分析 英雄方面很简单,跑一遍 Dijkstra 就行了,但是灭火团队就有点麻烦了. 这里可以借助一下最大流的建边来解决这个问题: 我们可以另外找一个点作为起点,然后建立从那个点到每一个团队的 ...

  7. 解析“60k”大佬的19道C#面试题(下)

    解析"60k"大佬的19道C#面试题(下) 在上篇中,我解析了前 10 道题目,本篇我将尝试解析后面剩下的所有题目. 姐妹篇:解析"60k"大佬的19道C#面试 ...

  8. 报错:Error updating database. Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'gender' at row 1

    我遇到这个错误是解决办法:我修改了对应的数据库字段的长度:原本我设置的是char型,但是存进去的是一个string型,结果就报了这个报了这个错误 下面就是数据库修改之后的结果. 以上都是我学习过程中遇 ...

  9. Python——迭代器的几个高级用法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第8篇文章. 今天我们依然介绍的是迭代器,不过介绍的是几个比较常用的高级用法,在实际场景当中非常实用,可以帮助我们大 ...

  10. 我国三大坐标系的区别(西安80、北京54、WGS-84)

    1.北京54坐标系(BJZ54) 北京54坐标系为参心大地坐标系,大地上的一点可用经度L54.纬度M54和大地高H54定位,它是以克拉索夫斯基椭球为基础,经局部平差后产生的坐标系. 1954年北京坐标 ...