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. Java14来了!Switch竟如此简单?Lombok也不需要了?来使用Idea配置Java14的开发环境吧!

    Java 14 在 2020.3.17 日发布正式版了,但现在很多公司还在使用 Java 7 或 Java 8,每当看到 Java 又发布新版本心里就慌得一匹.不过此版本并不是 LTS (长期支持版) ...

  2. GO语言web框架Gin之完全指南(二)

    这篇主要讲解自定义日志与数据验证 参数验证 我们知道,一个请求完全依赖前端的参数验证是不够的,需要前后端一起配合,才能万无一失,下面介绍一下,在Gin框架里面,怎么做接口参数验证的呢 gin 目前是使 ...

  3. [剑指offer]10.斐波那契数列+青蛙跳台阶问题

    10- I. 斐波那契数列 方法一 Top-down 用递归实现 def fibonacci(n): if n <= 0: return 0 if n == 1: return 1 return ...

  4. x86汇编指令集大全(带注释)

    X86和X87汇编指令大全(有注释) PUSH 压栈.POP 来说是出栈.入栈(push):---------- 一.数据传输指令 ---------------------------------- ...

  5. 为 .net 生态贡献力量——制作并上传 nuget 包(内有独家彩蛋)

    前言 nuget 是 .net 的常用包管理器,目前已经内置到 Visual Studio 2012 以后的版本.大多数 .net 包都托管在 nuget.org,包括 .net core 框架基础包 ...

  6. MySQL 教程--检视阅读

    MySQL 教程--检视阅读 准备:Windows 上安装 MySQL 教程地址,PHP语言基础 教程地址2 教程地址3,有讲数据库的备份和恢复 教程地址4,w3c.china,php基础,扩展阅读 ...

  7. MATLAB GUI 预约程序

    因为一起奇怪的原因,要做一个预约程序.初衷是能够完成注册.登陆.预约.查看个人信息等. 原本想用Java写的,又由于一些特殊原因耽搁了,导致最后只有一个晚上的时间,匆匆忙忙到最后就用MATLAB GU ...

  8. java实现小功能

    // 自写逻辑,遍历所有匹配的子字符串坐标 private static void forMatchIdx(String str1, String str2) { char[] arr1 = str1 ...

  9. go:数据类型

    Go语言中有丰富的数据类型,除了基本的整型.浮点型.布尔型.字符串外,还有数组.切片.结构体.函数.map.通道(channel)等.Go 语言的基本类型和其他语言大同小异. 1.基本数据类型 整型 ...

  10. “GANs”与“ODEs”:数学建模的终结?

    在本文中,我想将经典数学建模和机器学习之间建立联系,它们以完全不同的方式模拟身边的对象和过程.虽然数学家基于他们的专业知识和对世界的理解来创建模型,而机器学习算法以某种隐蔽的不完全理解的方式描述世界, ...