Skip to content

Commit 588bf19

Browse files
committed
Implemented Stream API Collectors for AbstractObject and AbstractArray
1 parent 6effa44 commit 588bf19

File tree

5 files changed

+127
-0
lines changed

5 files changed

+127
-0
lines changed

src/main/java/org/javawebstack/abstractdata/AbstractArray.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package org.javawebstack.abstractdata;
22

3+
import org.javawebstack.abstractdata.collector.AbstractArrayCollector;
4+
35
import java.util.*;
6+
import java.util.function.Function;
7+
import java.util.stream.Collector;
48
import java.util.stream.Stream;
59

610
public class AbstractArray implements AbstractElement, Iterable<AbstractElement> {
@@ -289,4 +293,12 @@ public AbstractElement clone() {
289293
return array;
290294
}
291295

296+
public static <T> Collector<T, ?, AbstractArray> collect(Function<T, AbstractElement> mappingFunction) {
297+
return new AbstractArrayCollector<>(mappingFunction);
298+
}
299+
300+
public static <T extends AbstractElement> Collector<T, ?, AbstractArray> collect() {
301+
return new AbstractArrayCollector<>(e -> e);
302+
}
303+
292304
}

src/main/java/org/javawebstack/abstractdata/AbstractElement.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,21 @@
33
import org.bson.BsonValue;
44
import org.javawebstack.abstractdata.bson.BsonConverter;
55
import org.javawebstack.abstractdata.bson.BsonTypeAdapter;
6+
import org.javawebstack.abstractdata.collector.AbstractObjectCollector;
67
import org.javawebstack.abstractdata.json.JsonDumper;
78
import org.javawebstack.abstractdata.json.JsonParser;
89
import org.javawebstack.abstractdata.util.QueryString;
910
import org.yaml.snakeyaml.DumperOptions;
1011
import org.yaml.snakeyaml.Yaml;
1112

1213
import java.text.ParseException;
14+
import java.util.ArrayList;
1315
import java.util.HashMap;
1416
import java.util.List;
1517
import java.util.Map;
18+
import java.util.function.Supplier;
19+
import java.util.stream.Collector;
20+
import java.util.stream.Collectors;
1621

1722
public interface AbstractElement {
1823

@@ -230,4 +235,5 @@ public boolean isPrimitive() {
230235
return this == NUMBER || this == BOOLEAN || this == STRING;
231236
}
232237
}
238+
233239
}

src/main/java/org/javawebstack/abstractdata/AbstractObject.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
package org.javawebstack.abstractdata;
22

3+
import org.javawebstack.abstractdata.collector.AbstractObjectCollector;
4+
35
import java.lang.reflect.Field;
46
import java.util.HashMap;
57
import java.util.LinkedHashMap;
68
import java.util.Map;
79
import java.util.Set;
810
import java.util.function.BiConsumer;
11+
import java.util.function.Function;
12+
import java.util.stream.Collector;
13+
import java.util.stream.Stream;
914

1015
public class AbstractObject implements AbstractElement {
1116

@@ -207,10 +212,18 @@ public AbstractArray values() {
207212
return AbstractArray.fromList(entries.values());
208213
}
209214

215+
public Stream<Map.Entry<String, AbstractElement>> stream() {
216+
return entries().stream();
217+
}
218+
210219
public AbstractElement clone() {
211220
AbstractObject object = new AbstractObject();
212221
forEach((k, v) -> object.set(k, v.clone()));
213222
return object;
214223
}
215224

225+
public static <T> Collector<T, ?, AbstractObject> collect(Function<T, String> keyFunction, Function<T, AbstractElement> valueFunction) {
226+
return new AbstractObjectCollector<>(keyFunction, valueFunction);
227+
}
228+
216229
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package org.javawebstack.abstractdata.collector;
2+
3+
import org.javawebstack.abstractdata.AbstractArray;
4+
import org.javawebstack.abstractdata.AbstractElement;
5+
6+
import java.util.*;
7+
import java.util.function.BiConsumer;
8+
import java.util.function.BinaryOperator;
9+
import java.util.function.Function;
10+
import java.util.function.Supplier;
11+
import java.util.stream.Collector;
12+
13+
public class AbstractArrayCollector<T> implements Collector<T, List<AbstractElement>, AbstractArray> {
14+
15+
private final Function<T, AbstractElement> mappingFunction;
16+
17+
public AbstractArrayCollector(Function<T, AbstractElement> mappingFunction) {
18+
this.mappingFunction = mappingFunction;
19+
}
20+
21+
public Supplier<List<AbstractElement>> supplier() {
22+
return ArrayList::new;
23+
}
24+
25+
public BiConsumer<List<AbstractElement>, T> accumulator() {
26+
return (l, e) -> l.add(mappingFunction.apply(e));
27+
}
28+
29+
public BinaryOperator<List<AbstractElement>> combiner() {
30+
return (l1, l2) -> { l1.addAll(l2); return l1; };
31+
}
32+
33+
public Function<List<AbstractElement>, AbstractArray> finisher() {
34+
return l -> {
35+
AbstractArray a = new AbstractArray();
36+
l.forEach(a::add);
37+
return a;
38+
};
39+
}
40+
41+
public Set<Characteristics> characteristics() {
42+
Set<Characteristics> characteristics = new HashSet<>();
43+
characteristics.add(Characteristics.UNORDERED);
44+
return characteristics;
45+
}
46+
47+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package org.javawebstack.abstractdata.collector;
2+
3+
import org.javawebstack.abstractdata.AbstractElement;
4+
import org.javawebstack.abstractdata.AbstractObject;
5+
6+
import java.util.*;
7+
import java.util.function.BiConsumer;
8+
import java.util.function.BinaryOperator;
9+
import java.util.function.Function;
10+
import java.util.function.Supplier;
11+
import java.util.stream.Collector;
12+
13+
public class AbstractObjectCollector<T> implements Collector<T, Map<String, AbstractElement>, AbstractObject> {
14+
15+
private final Function<T, String> keyFunction;
16+
private final Function<T, AbstractElement> valueFunction;
17+
18+
public AbstractObjectCollector(Function<T, String> keyFunction, Function<T, AbstractElement> valueFunction) {
19+
this.keyFunction = keyFunction;
20+
this.valueFunction = valueFunction;
21+
}
22+
23+
public Supplier<Map<String, AbstractElement>> supplier() {
24+
return HashMap::new;
25+
}
26+
27+
public BiConsumer<Map<String, AbstractElement>, T> accumulator() {
28+
return (m, e) -> m.put(keyFunction.apply(e), valueFunction.apply(e));
29+
}
30+
31+
public BinaryOperator<Map<String, AbstractElement>> combiner() {
32+
return (m1, m2) -> { m1.putAll(m2); return m1; };
33+
}
34+
35+
public Function<Map<String, AbstractElement>, AbstractObject> finisher() {
36+
return m -> {
37+
AbstractObject o = new AbstractObject();
38+
m.forEach(o::set);
39+
return o;
40+
};
41+
}
42+
43+
public Set<Characteristics> characteristics() {
44+
Set<Characteristics> characteristics = new HashSet<>();
45+
characteristics.add(Characteristics.UNORDERED);
46+
return characteristics;
47+
}
48+
49+
}

0 commit comments

Comments
 (0)