使用Java委託實現面向函式式語言中的map/filter

banq發表於2010-03-02
類似Python 這樣面向函式式functional語言提供Map/Filter這些函式來實現FP風格程式設計,好處是在高層次上能夠降低程式碼的複雜性(降低如何做How的複雜性)。

Use delegation to write map/filter in Java(需要翻牆)一文談了如何使用Java的泛型,透過委託模式來實現面向函式式語言中的Map/Filter類似功能。

首先看一下Map/Filter意思:
1.map(coll, f):透過遍歷集合coll,, 呼叫集合中每個元素f的方法, 將f的方法處理結果裝入一個集合返回。
假設Python有一個集合spam 和eggs方法,

spam = ['pork','ham','spices']
numbers = [1,2,3,4,5]

def eggs(item): 
    return item
<p class="indent">

那麼如果我們要獲得集合spam輸出,無疑要遍歷這個集合:

for i in spam:
   L.append(i)
print L
<p class="indent">

而使用map函式,就只需一句話:

L = map(eggs, spam)
print L
<p class="indent">


2.filter(coll, f) 類似map功能,遍歷這個集合,呼叫f,當f返回是真條件,才會把結果放入返回集合中。

map/filter真的幫助我們減少了大量迴圈遍歷垃圾編碼的編寫,還有更多精簡功能:
比如你有一個使用者集合,你需要返回使用者的id,作為id集合返回;然後你又需要返回使用者的姓名name集合,每個功能你都要實現一遍,如果再要返回使用者的年齡集合,你又要做一遍,瑣碎細節程式碼充斥在軟體系統中。

Use delegation to write map/filter in Java一文透過使用泛型和一個委託介面MapDelegate類來實現map函式,如下:

public class Mapper {

	<FromType, ToType> List<ToType> map(List<FromType> list, MapDelegate<FromType, ToType> mapDelegate) {
		List<ToType> retval = new ArrayList<ToType>(list.size());
		for (FromType item : list) {
			retval.add(mapDelegate.map(item));
		}
		return retval;
	}
}
<p class="indent">

其中介面MapDelegate如下:

public interface MapDelegate<FromType, ToType> {
	ToType map(FromType obj);
}
<p class="indent">

客戶端使用:

public static void main(String[] args) {
                
		List qs = new ArrayList();
		qs.add(new Q("afv"));
		qs.add(new Q("edsd"));
		qs.add(new Q("eedd"));

		Mapper mapper = new Mapper();

		List<String> ids = mapper.map(qs, new MapDelegate<Q, String>() {
			public String map(Q q) {
				return new StringBuilder(q.getV()).toString();
			}
		});

		System.out.print("ids=" + ids.get(1));
}
<p class="indent">

以上程式碼我經過除錯可執行。程式碼見下面附件。




[該貼被banq於2010-03-02 15:22修改過]

相關文章