初次聽說java中的函數對象可能,比較的陌生。可以類比着來理解一下,人們常說java中沒有了指針,殊不知,java中的對象引用就是指針,有時候我們說一個對象往往指的就是這個對象的引用,也就是說基本上把對象的引用很對象等同了。比如Integer a = new Integeer(3);我們說定義了一個整形對象a其實這個說法是錯誤的,a只是爭相對象new Integer(3)的一個引用而已(相當於是一個指針),這就是一種對象和引用混淆的說法,當然約定俗成就不會說這種話叫法是錯誤的。
那么函數對象,如果把對象理解成指針的話,也就是說,函數對象其實就是函數指針的概念。
函數對象做了這么一件事,我們可以定義一個只有方法而沒有數據的類,然后把這個類的對象傳遞給別的方法,這時傳遞的這個對象就是一個函數對象。
說起這個函數對象,其實存在那么一種設計模式,叫做策略模式,其主體就是函數對象的應用。
為什么會出現函數對象這種形式呢?很簡單,如果我們要比較一些元素,那么我們一般會在這些元素的類型定義上是想Comparable接口,但是現實情況往往比我們想想的復雜的多,可能實現這個接口並不能滿足我們的比較接口,這個時候我們就把比較規則封裝到一個函數對象中,然后把需要比較的數據元素和這個比較函數對象一塊傳遞給業務函數看下面一個例子:
我們要找出一個字符串數組中,字符串長度最長的字符串》
// 比較兩個字符串的長度 class FindMaxlength implements Comparator<String> { @Override public int compare(String o1, String o2) { // TODO Auto-generated method stub return o1.length()-o2.length(); } } public class TestProgram { public static void main(String[] args) { String[] arr = {"ZEBRA", "alligator", "crocodile"}; System.out.println(findMa(arr, new FindMaxlength()));// 傳入一個函數對象(指針) } public static <T> T maxLength(T[] arr, Comparator<? super T> cmp)// 傳遞一個函數對象 { int maxIndex = 0; for(int i = 0; i < arr.length; i++){ if(cmp.compare(arr[i], arr[maxIndex]) > 0) maxIndex = i; } return arr[maxIndex]; } }
