鉤子函數 Function類

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

    @Nullable T apply(@Nullable F input);

    @Override
    boolean equals(@Nullable Object object);

}


鉤子函數用法:app

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

  F  f = new F();函數

  T t =  func.apply(f);this

  -- 就獲得了想要的T對象了。。。google

}spa

調用鉤子函數:設計

backFunc(   new Function<F,T>() {    public T apply(F f){ return  處理f獲得T對象邏輯}      }      );code

 

例子:orm

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 爲鉤子函數。

相關文章
相關標籤/搜索