forked from hoohack/CodeInJavaNotes
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathArrayList.java
More file actions
125 lines (94 loc) · 2.78 KB
/
ArrayList.java
File metadata and controls
125 lines (94 loc) · 2.78 KB
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
package chapter12;
import java.util.Arrays;
import java.util.Objects;
import java.util.Optional;
import java.util.function.BinaryOperator;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import static java.lang.System.out;
/**
* 增加lambda方法
* @param <E>
*/
public class ArrayList<E> {
private Object[] elems;
private int next;
public ArrayList(int capacity) {
elems = new Object[capacity];
}
public ArrayList() {
this(16);
}
public void add(E e) {
if (next == elems.length) {
elems = Arrays.copyOf(elems, elems.length * 2);
}
elems[next++] = e;
}
public E get(int index) {
return (E) elems[index];
}
public int size() {
return next;
}
public void forEach(Consumer<? super E> action) {
Objects.requireNonNull(action);
final int size = this.next;
for (int i=0; i < size; i++) {
action.accept((E)elems[i]);
}
}
public ArrayList<E> filter(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
ArrayList<E> remainElem = new ArrayList<>();
final int size = next;
for (int i=0, k=0; i < size; i++) {
@SuppressWarnings("unchecked")
final E element = (E) elems[i];
if (filter.test(element)) {
remainElem.add(element);
}
}
return remainElem;
}
public ArrayList<E> map(Function<? super E, ? extends E> mapper) {
Objects.requireNonNull(mapper);
final int size = this.next;
ArrayList<E> mapElem = new ArrayList<>();
for (int i=0; i < size; i++) {
mapElem.add(mapper.apply((E)elems[i]));
}
return mapElem;
}
public Optional<E> reduce(E identity, BinaryOperator<E> accumulator) {
Objects.requireNonNull(accumulator);
final int size = this.next;
if (size == 0) {
return null;
}
E res = identity;
for (int i=0; i < size; i++) {
res = accumulator.apply(res, (E)elems[i]);
}
return Optional.ofNullable(res);
}
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
numbers.add(5);
numbers.add(6);
numbers.add(7);
numbers.add(8);
numbers.add(9);
numbers.add(10);
numbers.add(11);
numbers.add(12);
numbers.filter(n -> n > 5).forEach(out::println);
numbers.map(n -> n * 2).forEach(out::println);
out.println(numbers.reduce(0, (total, n) -> total + n).orElse(0));
}
}