钩子函数 Function类
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类的更多相关文章
- javascript中的高阶函数, 和 类定义Function, 和apply的使用
参考: http://www.cnblogs.com/delin/archive/2010/06/17/1759695.html js中的类, 也是用function关键字来定义的: function ...
- form组件类 钩子函数验证
# 全局钩子 def clean(self): pwd = self.cleaned_data.get("password") re_pwd = self.cleaned_data ...
- 【Mocha.js 101】钩子函数
前情提要 在上一篇文章<[Mocha.js 101]同步.异步与 Promise>中,我们学会了如何对同步方法.异步回调方法以及 Promise 进行测试. 在本篇文章中,我们将了解到 M ...
- php 钩子函数原理 解析
目前对钩子的理解:<转载:http://www.cnblogs.com/del/archive/2008/02/25/1080825.html> 譬如我们用鼠标在某个窗口上双击了一次, 或 ...
- HOOK钩子 - 钩子函数说明
翻译参考自MaybeHelios的blog: http://blog.csdn.net/maybehelios/ 通过SetWindowsHookEx方法安装钩子,该函数指定处理拦截消息的钩子函数(回 ...
- 用Delphi实现Windows的鼠标钩子函数
Delphi是基于PASCAL语言的Windows编程工具,功能十分强大.然而在Delphi的帮助文件中,对Windows API函数的说明沿袭了 VC 的格式,和VC一样,对很多API函数的用法没有 ...
- Vue的钩子函数[路由导航守卫、keep-alive、生命周期钩子]
前言 说到Vue的钩子函数,可能很多人只停留在一些很简单常用的钩子(created,mounted),而且对于里面的区别,什么时候该用什么钩子,并没有仔细的去研究过,且Vue的生命周期在面试中也算是比 ...
- js面向对象设计之function类
本文仅探讨如何合理的使用 function 在 javascript中实现一个面向对象设计的类.总所周知,javascript 并不能实现一个真正意义上的类,比如 protect 比如 函数重载.下面 ...
- PHP中钩子函数的实现与认识
PHP中钩子函数的实现与认识 分类:PHP编程 作者:rming 时间:2014-09-21 假如有这么一段程序: function fun(){ fun1(); fun2(); } 首先程序 ...
随机推荐
- Jenkinsfile里定义对象和函数,获取git提交人, 发送钉钉通知
自从开始使用Jenkinsfile作为Jenkins配置后就一发不可收,因为开发者自定义CI脚本实在太方便了. 比如,最近开发的以一个项目涉及多人,提交冲突挺多的,有的人自己没编译通过就提交了,导致后 ...
- 关于Web2.0
前言:本来是想写HTML的,发现没什么好写的,就简单写一下Web2.0好了 什么是Web 2.0: "Web 2.0 is the business revolution in the co ...
- Java第十三周实验作业
实验十三 图形界面事件处理技术 实验时间 2018-11-22 1.实验目的与要求 (1) 掌握事件处理的基本原理,理解其用途: 事件源:能够产生事件的对象都可以成为事件源,如文本框.按钮等,一个事 ...
- 洛谷 P2257 YY的GCD 题解
原题链接 庆祝: 数论紫题 \(T4\) 达成! 莫比乌斯 \(T1\) 达成! yy 真是个 神犇 前记 之前我觉得: 推式子,直接欧拉筛,筛出个 \(\phi\),然后乱推 \(\gcd\) 就行 ...
- [快速幂]Codeforces Round #576 (Div. 2)-C. MP3
C. MP3 time limit per test 1 second memory limit per test 256 megabytes input standard input output ...
- 向Hive中传入变量的方式
Hive向程序中传递变量的方式 暴力替换 字符串替换 正则替换 模板引擎 系统环境变量 shell环境变量:${env:varname} system系统变量:${system:varname} hi ...
- SpringBoot 集成多数据源
一个项目中怎么划分数据库,可以通过具体业务需求. 项目中数据源怎么如何划分,通过注解的方式@Datasource(ref="") 在方法上指定,会连接指定的数据源,这种方式比较繁琐 ...
- File.Create(path)未关闭遇到的一点点问题
本人老菜鸟一枚,不是因为偶是菜鸟中的老手,而是偶是老了但是还是很菜的鸟╮(╯▽╰)╭,不过打今儿起偶想要腾飞…… 今天写文本文件编辑类时遇到一个小问题,下面先将问题描述一下: 1.写文本文件时都会习惯 ...
- WiX 自定义
WiX 允许用户做一些自定义操作 用户界面向导 对于安装界面,用户可以用自己的位图.图标和许可证文本替换默认的.它们的路径存储在变量中,您可以在命令行或直接在源代码中指定这些变量: <WixVa ...
- 如何使用Java中的Enum类
Java1.5 中出现了枚举类型.当一个值都在一个固定的范围内变化,那就可以使用 enum 类型来定义.比如说,一周有七天,一年有四季. 没有枚举类的时候,我们用常量来定义一组范围值的: public ...