Skip to content

Commit 630ca6f

Browse files
committed
Add new methods: first(list, predicate), firstOrNull(list),
firstOrNull(list, predicate), last(list, predicate), lastOrNull(list), lastOrNull(list, predicate).
1 parent a0af73b commit 630ca6f

File tree

2 files changed

+143
-0
lines changed

2 files changed

+143
-0
lines changed

src/main/java/com/github/underscore/$.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -732,6 +732,34 @@ public List<T> first(final int n) {
732732
return ((List) iterable).subList(0, n);
733733
}
734734

735+
public static <E> E first(final Iterable<E> iterable, final Predicate<E> pred) {
736+
return filter(newArrayList(iterable), pred).iterator().next();
737+
}
738+
739+
public T first(final Predicate<T> pred) {
740+
return filter(newArrayList(iterable), pred).iterator().next();
741+
}
742+
743+
public static <E> E firstOrNull(final Iterable<E> iterable) {
744+
final Iterator<E> iterator = iterable.iterator();
745+
return iterator.hasNext() ? iterator.next() : null;
746+
}
747+
748+
public T firstOrNull() {
749+
final Iterator<T> iterator = iterable.iterator();
750+
return iterator.hasNext() ? iterator.next() : null;
751+
}
752+
753+
public static <E> E firstOrNull(final Iterable<E> iterable, final Predicate<E> pred) {
754+
final Iterator<E> iterator = filter(newArrayList(iterable), pred).iterator();
755+
return iterator.hasNext() ? iterator.next() : null;
756+
}
757+
758+
public T firstOrNull(final Predicate<T> pred) {
759+
final Iterator<T> iterator = filter(newArrayList(iterable), pred).iterator();
760+
return iterator.hasNext() ? iterator.next() : null;
761+
}
762+
735763
public static <E> E head(final Iterable<E> iterable) {
736764
return first(iterable);
737765
}
@@ -802,6 +830,32 @@ public List<T> last(final int n) {
802830
return last((List) iterable, n);
803831
}
804832

833+
public static <E> E last(final List<E> list, final Predicate<E> pred) {
834+
final List<E> filteredList = filter(list, pred);
835+
return filteredList.get(filteredList.size() - 1);
836+
}
837+
838+
public T last(final Predicate<T> pred) {
839+
return last((List<T>) iterable, pred);
840+
}
841+
842+
public static <E> E lastOrNull(final List<E> list) {
843+
return list.isEmpty() ? null : list.get(list.size() - 1);
844+
}
845+
846+
public T lastOrNull() {
847+
return lastOrNull((List<T>) iterable);
848+
}
849+
850+
public static <E> E lastOrNull(final List<E> list, final Predicate<E> pred) {
851+
final List<E> filteredList = filter(list, pred);
852+
return filteredList.isEmpty() ? null : filteredList.get(filteredList.size() - 1);
853+
}
854+
855+
public T lastOrNull(final Predicate<T> pred) {
856+
return lastOrNull((List<T>) iterable, pred);
857+
}
858+
805859
public static <E> List<E> rest(final List<E> list) {
806860
return rest(list, 1);
807861
}

src/test/java/com/github/underscore/ArraysTest.java

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,14 @@
2626
import org.junit.Test;
2727

2828
import java.util.Collection;
29+
import java.util.Collections;
2930
import java.util.List;
3031
import java.util.NoSuchElementException;
3132

3233
import static java.util.Arrays.asList;
3334
import static org.junit.Assert.assertArrayEquals;
3435
import static org.junit.Assert.assertEquals;
36+
import static org.junit.Assert.assertNull;
3537

3638
/**
3739
* Underscore library unit test.
@@ -58,6 +60,50 @@ public void first() {
5860
assertEquals("[5, 4]", resultList.toString());
5961
final int resultInt = $.first(new Integer[] {5, 4, 3, 2, 1});
6062
assertEquals(5, resultInt);
63+
final int resultPred = $.first(asList(5, 4, 3, 2, 1), new Predicate<Integer>() {
64+
public Boolean apply(Integer item) {
65+
return item % 2 == 0;
66+
}
67+
});
68+
assertEquals(4, resultPred);
69+
final int resultPredObj = new $<Integer>(asList(5, 4, 3, 2, 1)).first(new Predicate<Integer>() {
70+
public Boolean apply(Integer item) {
71+
return item % 2 == 0;
72+
}
73+
});
74+
assertEquals(4, resultPredObj);
75+
}
76+
77+
@Test
78+
public void firstOrNull() {
79+
final Integer result = $.firstOrNull(asList(5, 4, 3, 2, 1));
80+
assertEquals("5", result.toString());
81+
final Integer resultObj = new $<Integer>(asList(5, 4, 3, 2, 1)).firstOrNull();
82+
assertEquals("5", resultObj.toString());
83+
assertNull($.firstOrNull(Collections.emptyList()));
84+
assertNull(new $<Integer>(Collections.<Integer>emptyList()).firstOrNull());
85+
final int resultPred = $.firstOrNull(asList(5, 4, 3, 2, 1), new Predicate<Integer>() {
86+
public Boolean apply(Integer item) {
87+
return item % 2 == 0;
88+
}
89+
});
90+
assertEquals(4, resultPred);
91+
assertNull($.firstOrNull(Collections.<Integer>emptyList(), new Predicate<Integer>() {
92+
public Boolean apply(Integer item) {
93+
return item % 2 == 0;
94+
}
95+
}));
96+
final int resultPredObj = new $<Integer>(asList(5, 4, 3, 2, 1)).firstOrNull(new Predicate<Integer>() {
97+
public Boolean apply(Integer item) {
98+
return item % 2 == 0;
99+
}
100+
});
101+
assertEquals(4, resultPredObj);
102+
assertNull(new $<Integer>(Collections.<Integer>emptyList()).firstOrNull(new Predicate<Integer>() {
103+
public Boolean apply(Integer item) {
104+
return item % 2 == 0;
105+
}
106+
}));
61107
}
62108

63109
@Test(expected = NoSuchElementException.class)
@@ -213,8 +259,51 @@ public void last() {
213259
assertEquals("last one item did not work", 5, res.intValue());
214260
List<Integer> resList = new $(asList(1, 2, 3, 4, 5)).last(3);
215261
assertEquals("last multi item did not wok", asList(3, 4, 5), resList);
262+
final int resultPred = $.last(asList(5, 4, 3, 2, 1), new Predicate<Integer>() {
263+
public Boolean apply(Integer item) {
264+
return item % 2 == 0;
265+
}
266+
});
267+
assertEquals(2, resultPred);
268+
final int resultPredObj = new $<Integer>(asList(5, 4, 3, 2, 1)).last(new Predicate<Integer>() {
269+
public Boolean apply(Integer item) {
270+
return item % 2 == 0;
271+
}
272+
});
273+
assertEquals(2, resultPredObj);
216274
}
217275

276+
@Test
277+
public void lastOrNull() {
278+
final Integer result = $.lastOrNull(asList(5, 4, 3, 2, 1));
279+
assertEquals("1", result.toString());
280+
final Integer resultObj = new $<Integer>(asList(5, 4, 3, 2, 1)).lastOrNull();
281+
assertEquals("1", resultObj.toString());
282+
assertNull($.lastOrNull(Collections.emptyList()));
283+
assertNull(new $<Integer>(Collections.<Integer>emptyList()).lastOrNull());
284+
final int resultPred = $.lastOrNull(asList(5, 4, 3, 2, 1), new Predicate<Integer>() {
285+
public Boolean apply(Integer item) {
286+
return item % 2 == 0;
287+
}
288+
});
289+
assertEquals(2, resultPred);
290+
assertNull($.lastOrNull(Collections.<Integer>emptyList(), new Predicate<Integer>() {
291+
public Boolean apply(Integer item) {
292+
return item % 2 == 0;
293+
}
294+
}));
295+
final int resultPredObj = new $<Integer>(asList(5, 4, 3, 2, 1)).lastOrNull(new Predicate<Integer>() {
296+
public Boolean apply(Integer item) {
297+
return item % 2 == 0;
298+
}
299+
});
300+
assertEquals(2, resultPredObj);
301+
assertNull(new $<Integer>(Collections.<Integer>emptyList()).lastOrNull(new Predicate<Integer>() {
302+
public Boolean apply(Integer item) {
303+
return item % 2 == 0;
304+
}
305+
}));
306+
}
218307
/*
219308
_.compact([0, 1, false, 2, '', 3]);
220309
=> [1, 2, 3]

0 commit comments

Comments
 (0)