實作基本的陣列操作。
在函式式語言中,length、map和reduce這類陣列操作非常常見。請在不使用現有函式的情況下,實作一系列基本的陣列操作。
要實作的操作,其確切數量和名稱會依 track 而有所不同,以避免與現有名稱衝突,但你會實作的一般操作包括:
append(給定兩個陣列,把第二個陣列中的所有項目加到第一個陣列的尾端);concatenate(給定一連串的陣列,把所有陣列中的所有項目合併成一個攤平的陣列);filter(給定一個述詞和一個陣列,回傳所有 predicate(item) 為 True 的項目所組成的陣列);length(給定一個陣列,回傳其中項目的總數);map(給定一個函式和一個陣列,回傳對所有項目套用 function(item) 所得結果的陣列);foldl(給定一個函式、一個陣列和初始累加器,從左側將每個項目摺疊(縮減)進累加器);foldr(給定一個函式、一個陣列和一個初始累加器,從右側將每個項目摺疊(縮減)進累加器);reverse(給定一個陣列,回傳一個包含所有原始項目、但順序相反的陣列)。請注意,傳遞給摺疊函式(foldl、foldr)的引數順序很重要。
在 Java 中,一般認為使用實例方法會比類別方法更好。不過在某些情況下,讓函式成為static是絕對恰當的。因為 Java 的類別是封閉的、無法修改(也就是說,你無法像在 Ruby 或 JavaScript 等其他語言那樣,在類別定義之外為它新增成員),所以你沒辦法直接為類別加上新的行為。如果你還是想為某個型別定義行為,該怎麼辦?這種情況下最道地的做法,就是寫一個工具方法。
這類方法集合起來,通常被稱為「工具類別」。JRE 裡就有這類類別,例如 Arrays 和 Collections。
在這個練習中,我們希望 List 能有map()、reduce()、filter()等方法。但 List 本身沒有這些方法,所以我們改用靜態方法。
foldLeft 和 foldRight 這兩個方法是「fold」函式,這個概念在函式程式設計的世界裡廣為人知,在物件導向的世界裡卻比較少見。想了解摺疊的一般背景與簽章/實作提示,請參閱維基百科上關於摺疊的頁面。