Skip to content

Commit 57e0de2

Browse files
committed
make more gatherers null-aware
1 parent b855527 commit 57e0de2

6 files changed

Lines changed: 44 additions & 6 deletions

File tree

src/main/java/io/github/jhspetersson/packrat/DropLastNGatherer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package io.github.jhspetersson.packrat;
22

3-
import java.util.ArrayDeque;
43
import java.util.Deque;
4+
import java.util.LinkedList;
55
import java.util.function.Supplier;
66
import java.util.stream.Gatherer;
77

@@ -24,7 +24,7 @@ class DropLastNGatherer<T> implements Gatherer<T, Deque<T>, T> {
2424

2525
@Override
2626
public Supplier<Deque<T>> initializer() {
27-
return ArrayDeque::new;
27+
return LinkedList::new;
2828
}
2929

3030
@Override

src/main/java/io/github/jhspetersson/packrat/FixedSizeDeque.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package io.github.jhspetersson.packrat;
22

3-
import java.util.ArrayDeque;
43
import java.util.Collection;
54
import java.util.Deque;
65
import java.util.Iterator;
6+
import java.util.LinkedList;
77

88
/**
99
* A fixed-size deque implementation that automatically removes the oldest element
1010
* when the maximum size is reached and a new element is added.
11+
* <p>
12+
* Backed by a {@link LinkedList} so that {@code null} elements are permitted.
1113
*
1214
* @param <E> the type of elements held in this deque
1315
* @author jhspetersson
@@ -27,7 +29,7 @@ public FixedSizeDeque(int maxSize) {
2729
}
2830

2931
this.maxSize = maxSize;
30-
this.delegate = new ArrayDeque<>(maxSize);
32+
this.delegate = new LinkedList<>();
3133
}
3234

3335
@Override

src/main/java/io/github/jhspetersson/packrat/LastingGatherer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package io.github.jhspetersson.packrat;
22

3-
import java.util.ArrayDeque;
43
import java.util.Deque;
54
import java.util.HashSet;
65
import java.util.Iterator;
6+
import java.util.LinkedList;
77
import java.util.Objects;
88
import java.util.Set;
99
import java.util.function.BiConsumer;
@@ -99,7 +99,7 @@ static class State<T> implements Iterable<T> {
9999
final Function<? super T, ?> mapper;
100100

101101
State(boolean unique, Function<? super T, ?> mapper) {
102-
this.deque = new ArrayDeque<>();
102+
this.deque = new LinkedList<>();
103103
this.mappedElements = new HashSet<>();
104104
this.unique = unique;
105105
this.mapper = mapper;

src/test/java/io/github/jhspetersson/packrat/DropLastNTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
import org.junit.jupiter.api.Test;
44

55
import java.util.ArrayList;
6+
import java.util.Arrays;
67
import java.util.List;
78
import java.util.stream.IntStream;
9+
import java.util.stream.Stream;
810

911
import static io.github.jhspetersson.packrat.TestUtils.isOrderedSequence;
1012
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -94,6 +96,15 @@ void dropLastWithStreamMuchLargerThanBuffer() {
9496
assertEquals(94, result.getLast());
9597
}
9698

99+
@Test
100+
void dropLastWithNullElements() {
101+
var after = Stream.of("a", null, "b", null, "c")
102+
.gather(Packrat.dropLast(2))
103+
.toList();
104+
105+
assertEquals(Arrays.asList("a", null, "b"), after);
106+
}
107+
97108
@Test
98109
void dropLastLargeNWithLargerStream() {
99110
var result = IntStream.range(0, 50).boxed()

src/test/java/io/github/jhspetersson/packrat/LastNTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
import org.junit.jupiter.api.Test;
44

55
import java.util.ArrayList;
6+
import java.util.Arrays;
67
import java.util.List;
78
import java.util.stream.IntStream;
9+
import java.util.stream.Stream;
810

911
import static io.github.jhspetersson.packrat.TestUtils.getEmployees;
1012
import static io.github.jhspetersson.packrat.TestUtils.isOrderedSequence;
@@ -110,6 +112,15 @@ public void nullMapperThrows() {
110112
assertThrows(NullPointerException.class, () -> new LastingGatherer<Employee>(3, true, null));
111113
}
112114

115+
@Test
116+
void lastWithNullElements() {
117+
var after = Stream.of("a", null, "b", null, "c")
118+
.gather(Packrat.last(2))
119+
.toList();
120+
121+
assertEquals(Arrays.asList(null, "c"), after);
122+
}
123+
113124
@Test
114125
void lastUniqueShouldMoveDuplicateToEnd() {
115126
var result = List.of("A", "B", "C", "A").stream()

src/test/java/io/github/jhspetersson/packrat/WindowSlidingWithIndexTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.junit.jupiter.api.Test;
44

5+
import java.util.Arrays;
56
import java.util.List;
67
import java.util.stream.IntStream;
78
import java.util.stream.Stream;
@@ -27,6 +28,19 @@ public void windowSlidingWithIndexTest() {
2728
assertEquals(List.of(8, 9, 10), result.get(7).getValue());
2829
}
2930

31+
@Test
32+
public void windowSlidingWithIndexNullElementsTest() {
33+
var result = Stream.of("a", null, "b").gather(Packrat.windowSlidingWithIndex(2)).toList();
34+
35+
assertEquals(2, result.size());
36+
37+
assertEquals(0L, result.get(0).getKey());
38+
assertEquals(Arrays.asList("a", null), result.get(0).getValue());
39+
40+
assertEquals(1L, result.get(1).getKey());
41+
assertEquals(Arrays.asList(null, "b"), result.get(1).getValue());
42+
}
43+
3044
@Test
3145
public void windowSlidingWithIndexCustomStartTest() {
3246
var numbers = IntStream.rangeClosed(1, 5).boxed();

0 commit comments

Comments
 (0)