Skip to content

Commit 7c1f53f

Browse files
committed
Added Utility
1 parent d10a5a4 commit 7c1f53f

File tree

2 files changed

+138
-0
lines changed

2 files changed

+138
-0
lines changed
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package org.schabi.newpipe.extractor.streamdata.stream.util;
2+
3+
import java.util.ArrayList;
4+
import java.util.Collections;
5+
import java.util.EnumSet;
6+
import java.util.List;
7+
import java.util.Set;
8+
import java.util.function.BiConsumer;
9+
import java.util.function.BinaryOperator;
10+
import java.util.function.Function;
11+
import java.util.function.Supplier;
12+
import java.util.stream.Collector;
13+
import java.util.stream.Stream;
14+
15+
public final class NewPipeStreamCollectors {
16+
private NewPipeStreamCollectors() {
17+
// No impl
18+
}
19+
20+
public static <T extends org.schabi.newpipe.extractor.streamdata.stream.Stream>
21+
Collector<T, ?, List<T>> toDistinctList() {
22+
return deduplicateEqualStreams(x -> x);
23+
}
24+
25+
public static <T extends org.schabi.newpipe.extractor.streamdata.stream.Stream>
26+
Collector<T, ?, Stream<T>> toDistinctStream() {
27+
return deduplicateEqualStreams(List::stream);
28+
}
29+
30+
public static <T extends org.schabi.newpipe.extractor.streamdata.stream.Stream, R>
31+
Collector<T, ?, R> deduplicateEqualStreams(final Function<List<T>, R> finisher) {
32+
return new CollectorImpl<>(
33+
(Supplier<List<T>>) ArrayList::new,
34+
List::add,
35+
(left, right) -> {
36+
for(final T rightElement : right) {
37+
if (NewPipeStreamUtil.containSimilarStream(rightElement, left)) {
38+
left.add(rightElement);
39+
}
40+
}
41+
return left;
42+
},
43+
finisher,
44+
CH_ID);
45+
}
46+
47+
/**
48+
* Copied from {@link java.util.stream.Collectors}
49+
*/
50+
static final Set<Collector.Characteristics> CH_ID =
51+
Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH));
52+
53+
/**
54+
* Copied from {@link java.util.stream.Collectors}
55+
*/
56+
static class CollectorImpl<T, A, R> implements Collector<T, A, R> {
57+
private final Supplier<A> supplier;
58+
private final BiConsumer<A, T> accumulator;
59+
private final BinaryOperator<A> combiner;
60+
private final Function<A, R> finisher;
61+
private final Set<Characteristics> characteristics;
62+
63+
CollectorImpl(final Supplier<A> supplier,
64+
final BiConsumer<A, T> accumulator,
65+
final BinaryOperator<A> combiner,
66+
final Function<A,R> finisher,
67+
final Set<Characteristics> characteristics) {
68+
this.supplier = supplier;
69+
this.accumulator = accumulator;
70+
this.combiner = combiner;
71+
this.finisher = finisher;
72+
this.characteristics = characteristics;
73+
}
74+
75+
@Override
76+
public BiConsumer<A, T> accumulator() {
77+
return accumulator;
78+
}
79+
80+
@Override
81+
public Supplier<A> supplier() {
82+
return supplier;
83+
}
84+
85+
@Override
86+
public BinaryOperator<A> combiner() {
87+
return combiner;
88+
}
89+
90+
@Override
91+
public Function<A, R> finisher() {
92+
return finisher;
93+
}
94+
95+
@Override
96+
public Set<Characteristics> characteristics() {
97+
return characteristics;
98+
}
99+
}
100+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package org.schabi.newpipe.extractor.streamdata.stream.util;
2+
3+
import org.schabi.newpipe.extractor.streamdata.stream.Stream;
4+
5+
import java.util.ArrayList;
6+
import java.util.Collection;
7+
import java.util.List;
8+
9+
public final class NewPipeStreamUtil {
10+
private NewPipeStreamUtil() {
11+
// No impl
12+
}
13+
14+
/**
15+
* Checks if the list already contains a stream with the same statistics.
16+
*
17+
* @param stream the stream to be compared against the streams in the stream list
18+
* @param streams the list of {@link Stream}s which will be compared
19+
* @return whether the list already contains one stream with equals stats
20+
*/
21+
public static boolean containSimilarStream(final Stream stream,
22+
final Collection<? extends Stream> streams) {
23+
if (streams == null || streams.isEmpty()) {
24+
return false;
25+
}
26+
return streams.stream().anyMatch(stream::equalsStream);
27+
}
28+
29+
public <T extends Stream> List<T> removeEqualStreams(final Collection<T> streams) {
30+
final List<T> returnList = new ArrayList<>();
31+
for(final T stream : streams) {
32+
if (!containSimilarStream(stream, returnList)) {
33+
returnList.add(stream);
34+
}
35+
}
36+
return returnList;
37+
}
38+
}

0 commit comments

Comments
 (0)