国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Java泛型模擬scala實(shí)現(xiàn)自定義ArrayList方式

Java泛型模擬scala實(shí)現(xiàn)自定義ArrayList方式

2022-02-13 15:02遙遙晚風(fēng)點(diǎn)點(diǎn) Java教程

這篇文章主要介紹了Java泛型模擬scala實(shí)現(xiàn)自定義ArrayList方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

泛型模擬scala實(shí)現(xiàn)自定義ArrayList

泛型就是將類型由原來的具體的類型參數(shù)化,類似于方法中的變量參數(shù),此時(shí)類型也定義成參數(shù)形式(可以稱之為類型形參),

然后在使用/調(diào)用時(shí)傳入具體的類型

操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù),這種參數(shù)類型可以用在類、接口和方法中,分別被稱為泛型類、泛型接口、泛型方法。

以下實(shí)例通過泛型,靈活的實(shí)現(xiàn)了類似scala中集合的map,reduce方法,并可以鏈?zhǔn)骄幊?/p>

Function1:一個(gè)入?yún)⒌姆盒徒涌冢鏼ap(),filter()

?
1
2
3
4
//泛型接口
public interface Function1<T, R> {
    R call(T t);
}

Function2:兩個(gè)入?yún)⒌姆盒徒涌冢鐁educe()

?
1
2
3
4
//泛型接口
public interface Function2<E> {
    E call(E elem,E sum);
}

MyList:自定義List

?
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
import java.util.ArrayList;
//泛型類
public class MyList<E> extends ArrayList<E> {
    //泛型方法  (只有在public修飾符和返回值之間用了泛型的才是泛型方法,指定后,該方法內(nèi)可以使用該泛型)
    public <R> MyList<R> map(Function1<E, R> fun){
        MyList<R> myList = new MyList<>();
        for (E e : this) {
            R res = fun.call(e);
            myList.add(res);
        }
        return myList;
    }
 
    //這個(gè)不是泛型方法,泛型在引用時(shí)指定,可以是泛型類中已經(jīng)定義的,也可以是具體的類
    public MyList<E> filter(Function1<E,Boolean> fun){
        MyList<E> myList = new MyList<>();
        for(E elem : this){
            Boolean flag = fun.call(elem);
            if(flag){
                myList.add(elem);
            }
        }
        return myList;
    }
 
    //這個(gè)也不是泛型方法
    public E reduce(Function2<E> fun){
        E sum = null;
        boolean isFirst = true;
        for (E elem : this) {
            if(isFirst){
               sum =  elem;
               isFirst = false;
            }else {
                sum = fun.call(elem,sum);
            }
        }
        return sum;
    }
}

測(cè)試:

?
1
2
3
4
5
6
7
8
9
10
11
12
public class MyTest {
    public static void main(String[] args) {
        MyList<String> myList = new MyList<>();
        myList.add("aaaa");
        myList.add("bbbb");
        myList.add("cccc");
        myList.add("accc");
 
        String res = myList.filter(x -> x.contains("a")).map(x -> x.toUpperCase()).reduce((x, y) -> x + y);
        System.out.println(res);
    }
}

輸出:

Java泛型模擬scala實(shí)現(xiàn)自定義ArrayList方式

自定義實(shí)現(xiàn)ArrayList代碼

 "雙十一讓你明白,有些東西,打半折你也買不起;就像你喜歡的人,眼光降低一半,還是看不上你“。所以,在JDK1.8中,ArrayList底層是怎么實(shí)現(xiàn)的呢?(看源碼能理解就行)

?
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/**
 * 自定義實(shí)現(xiàn)ArrayList
 */
public class TextArrayList<E> {
    private Object[] elementData;
    private int size;
    private static final int DEFALT_CAPACITY = 10;
    /**
     * 無參構(gòu)造,默認(rèn)數(shù)組大小為10
     */
    public TextArrayList() {
        elementData = new Object[DEFALT_CAPACITY];
    }
    /**
     * 有參構(gòu)造,數(shù)組大小為傳入的值
     */
    public TextArrayList(int capacity) {
        if (capacity < 0) {
            throw new RuntimeException("容器容量不能為負(fù)數(shù)");
        } else if (capacity == 0) {
            elementData = new Object[DEFALT_CAPACITY];
        } else {
            elementData = new Object[capacity];
        }
    }
    /**
     * 給數(shù)組中添加元素
     *
     * @param element */
    public void add(E element) {
        //數(shù)組擴(kuò)容
        if (size == elementData.length) {
            Object[] newArray = new Object[elementData.length + (elementData.length >> 1)];
            System.arraycopy(elementData, 0, newArray, 0, elementData.length);
            elementData = newArray;
        }
        elementData[size++] = element;
    }
    /**
     * 刪除元素
     * 挨個(gè)比較所有元素,獲得第一個(gè)比較結(jié)果為True的,返回
     *
     * @return
     */
    public void remove(E element) {
        for (int i = 0; i < size; i++) {
            if (element.equals(get(i))) {
                //比較操作用到equals方法
                System.arraycopy(elementData, i + 1, elementData, i, elementData.length - i - 1);
                elementData[size - 1] = null;
                size--;
            }
        }
    }
    /**
     * 刪除索引
     *
     * @return
     */
    public void remove(int index) {
        int numMoved = elementData.length - index - 1;
        if (numMoved > 0) {
            System.arraycopy(elementData, index + 1, elementData, index, numMoved);
        }
        elementData[size - 1] = null;
        size--;
    }
    /**
     * 判空
     *
     * @return
     */
    public boolean isEmpty() {
        return size == 0 ? true : false;
    }
    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();
        //[a,b,c]
        stringBuilder.append("[");
        for (int i = 0; i < size; i++) {
            stringBuilder.append(elementData[i] + ",");
        }
        stringBuilder.setCharAt(stringBuilder.length() - 1, ']');
        return stringBuilder.toString();
    }
    /**
     * 增加get方法
     *
     * @param index
     */
    public E get(int index) {
        checkRange(index);
        return (E) elementData[index];
    }
    /**
     * 增加set方法
     *
     * @param index
     */
    public void set(E element, int index) {
        checkRange(index);
        elementData[index] = element;
    }
    //判斷索引合法性
    public void checkRange(int index) {
        if (index < 0 || index > size - 1) {
            throw new RuntimeException("索引不合法:" + index);
        }
    }
    public static void main(String[] args) {
        TextArrayList t1 = new TextArrayList(20);
//        t1.add("aa");
//        t1.add("bb");
        for (int i = 0; i < 40; i++) {
            t1.add("wang" + i);
        }
        t1.set("sss", 10);
        System.out.println(t1);
        System.out.println(t1.get(39));
        t1.remove(3);
        t1.remove("wang5");
        System.out.println(t1);
        System.out.println(t1.size);
        System.out.println(t1.isEmpty());
    }
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/Mr_ye931/article/details/107702904

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 福利在线小视频 | 精品久久久久久久 | 午夜av免费 | 日韩大片在线观看 | av在线资源网| 亚洲影音 | 欧美福利在线观看 | 日韩精品免费一区二区三区 | 在线免费观看日韩视频 | a视频在线 | 999精品在线 | 欧美成人免费视频 | 欧美一级一区 | 欧洲一区二区在线观看 | 国产精品一区欧美 | 日韩另类 | 日韩91 | 午夜精品久久久久久久久久久久 | 日韩av片在线免费观看 | 久久国产精品免费一区二区三区 | 激情五月综合 | 亚洲91精品| 国产精品久久久久久久午夜 | 国产成年人电影在线观看 | 久久精品日产第一区二区三区 | 国产精品a久久久久 | 亚洲一二三 | 色婷婷综合久久久中字幕精品久久 | 天天操,夜夜操 | 精品久久久久国产 | 亚洲欧美高清 | 亚洲免费一区 | ...99久久国产成人免费精品 | 精品一区二区三区免费 | 国产成人久久 | 日韩在线一区二区 | 久久小视频 | 国产高清不卡在线 | 黄色大片免费网址 | 成人在线手机版视频 | 午夜家庭影院 |