JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » JavaTwo 討論區 » 2012 JavaTwo  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
threaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 Java SE 8 Lambda 結合 Algebraic Data Type 的函數式風格範例
caterpillar

良葛格

版主

發文: 2613
積分: 70
於 2012-07-25 16:33 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
也是為專欄寫的簡單範例,結合 Java SE 8 中的 Lambda 等特性,沒有 Pattern match 語法還是比較麻煩一些,只好把結構寫在 List 介面中,並使用 if 作判斷來取代 Pattern match ... XD

其它指定索引取元素、計算長度、反轉、fold left、fold right .... 等函式,就是以類似風格來實作 ...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import java.util.*;
 
interface F1<P, R> {
    R apply(P p);
}
 
public class AlgebraicType {
    public static interface List<T> {
        T head() default { return null; }
        List<T> tail() default { return null; }
    }
    
    private static final List<? extends Object> Nil = new List<Object>() {
        public String toString() { return "[]"; }
    };
    
    public static <T> List<T> nil() {
        return (List<T>) Nil;
    }
    
    public static <T> List<T> cons(final T x, final List<T> xs) {
        return new List<T>() {
            private T head;
            private List<T> tail;
            { this.head = x; this.tail = xs; }
            public T head(){ return this.head; }
            public List<T> tail() { return this.tail; }
            public String toString() { return head() + ":" + tail(); }
        };
    }
    
    public static <T> List<T> list(T... elems) {
        if(elems.length == 0) return nil();
        T[] remain = Arrays.copyOfRange(elems, 1,  elems.length);
        return cons(elems[0], list(remain));
    }
    
    public static <T> List<T> filter(List<T> lt, F1<T, Boolean> f) {
        if(lt == nil()) return nil();
        if(f.apply(lt.head())) return cons(lt.head(), filter(lt.tail(), f));
        return filter(lt.tail(), f);
    }
    
    public static <T, R> List<R> map(List<T> lt, F1<T, R> f) {
        if(lt == nil()) return nil();
        return cons(f.apply(lt.head()), map(lt.tail(), f));
    }
    
    public static void main(String[] args) {
        // 1:2:3:4:5:[]
        System.out.println(list(1, 2, 3, 4, 5));
        
        // 4:5:[]
        System.out.println(filter(list(1, 2, 3, 4, 5), x -> x > 3));
        
        // 3:6:9:12:15:[]
        System.out.println(map(list(1, 2, 3, 4, 5), x -> x * 3));
    }
}


caterpillar edited on 2012-07-31 14:44

良葛格學習筆記
作者 Re:Java SE 8 Lambda 結合 Algebraic Data Type 的函數式風格範例 [Re:caterpillar]
caterpillar

良葛格

版主

發文: 2613
積分: 70
於 2012-09-19 20:56 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
可搭配 抽象資料型態與代數抽象型態 服用 ... XD


良葛格學習筆記
» JWorld@TW »  JavaTwo 討論區 » 2012 JavaTwo

threaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8