Skip to content

Commit 937a0fa

Browse files
authored
Add $.and(predicates) and $.or(predicates) methods.
1 parent 2b9f230 commit 937a0fa

File tree

2 files changed

+124
-0
lines changed

2 files changed

+124
-0
lines changed

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

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2792,6 +2792,16 @@ public static <T> T checkNotNull(T reference) {
27922792
return reference;
27932793
}
27942794

2795+
public static <T> List<T> checkNotNullElements(List<T> references) {
2796+
if (references == null) {
2797+
throw new NullPointerException();
2798+
}
2799+
for (T reference : references) {
2800+
checkNotNull(reference);
2801+
}
2802+
return references;
2803+
}
2804+
27952805
public static <T> T checkNotNull(T reference, Object errorMessage) {
27962806
if (reference == null) {
27972807
throw new NullPointerException(String.valueOf(errorMessage));
@@ -2862,6 +2872,54 @@ protected static <K, E> Map<K, E> newLinkedHashMap() {
28622872
return new LinkedHashMap<K, E>();
28632873
}
28642874

2875+
public static <T> Predicate<T> and(
2876+
final Predicate<? super T> pred1,
2877+
final Predicate<? super T> pred2,
2878+
final Predicate<? super T>... rest) {
2879+
checkNotNull(pred1);
2880+
checkNotNull(pred2);
2881+
checkNotNullElements(Arrays.asList(rest));
2882+
return new Predicate<T>() {
2883+
@Override
2884+
public boolean test(T value) {
2885+
boolean result = pred1.test(value) && pred2.test(value);
2886+
if (!result) {
2887+
return false;
2888+
}
2889+
for (Predicate<? super T> predicate : rest) {
2890+
if (!predicate.test(value)) {
2891+
return false;
2892+
}
2893+
}
2894+
return true;
2895+
}
2896+
};
2897+
}
2898+
2899+
public static <T> Predicate<T> or(
2900+
final Predicate<? super T> pred1,
2901+
final Predicate<? super T> pred2,
2902+
final Predicate<? super T>... rest) {
2903+
checkNotNull(pred1);
2904+
checkNotNull(pred2);
2905+
checkNotNullElements(Arrays.asList(rest));
2906+
return new Predicate<T>() {
2907+
@Override
2908+
public boolean test(T value) {
2909+
boolean result = pred1.test(value) || pred2.test(value);
2910+
if (result) {
2911+
return true;
2912+
}
2913+
for (Predicate<? super T> predicate : rest) {
2914+
if (predicate.test(value)) {
2915+
return true;
2916+
}
2917+
}
2918+
return false;
2919+
}
2920+
};
2921+
}
2922+
28652923
public static void main(String ... args) {
28662924
final String message = "Underscore-java is a java port of Underscore.js.\n\n"
28672925
+ "In addition to porting Underscore's functionality, Underscore-java includes matching unit tests.\n\n"

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

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,11 +432,77 @@ public void checkNotNullWithMessage() {
432432
$.checkNotNull(null, "Error message");
433433
}
434434

435+
@Test(expected = NullPointerException.class)
436+
public void checkNotNull2() {
437+
$.checkNotNullElements(null);
438+
}
439+
435440
@Test
436441
public void checkNotNullWithObjectAndMessage() {
437442
assertEquals("123", $.checkNotNull("123", "Error message"));
438443
}
439444

445+
@Test
446+
@SuppressWarnings("unchecked")
447+
public void and() {
448+
Predicate<Integer> predicate = $.and(
449+
new Predicate<Object>() {
450+
@Override
451+
public boolean test(Object value) {
452+
return value != null;
453+
}
454+
},
455+
new Predicate<Number>() {
456+
@Override
457+
public boolean test(Number value) {
458+
return value.intValue() > 0;
459+
}
460+
},
461+
new Predicate<Integer>() {
462+
@Override
463+
public boolean test(Integer value) {
464+
return (50 <= value) && (value <= 60);
465+
}
466+
});
467+
assertTrue(predicate.test(50));
468+
assertFalse(predicate.test(null));
469+
assertFalse(predicate.test(-56));
470+
assertTrue(predicate.test(60));
471+
assertFalse(predicate.test(62));
472+
assertFalse(predicate.test(1002));
473+
}
474+
475+
@Test
476+
@SuppressWarnings("unchecked")
477+
public void or() {
478+
Predicate<Integer> predicate = $.or(
479+
new Predicate<Object>() {
480+
@Override
481+
public boolean test(Object value) {
482+
return value == null;
483+
}
484+
},
485+
new Predicate<Number>() {
486+
@Override
487+
public boolean test(Number value) {
488+
return value.intValue() > 2000;
489+
}
490+
},
491+
new Predicate<Integer>() {
492+
@Override
493+
public boolean test(Integer value) {
494+
return (50 <= value) && (value <= 60);
495+
}
496+
});
497+
assertTrue(predicate.test(50));
498+
assertTrue(predicate.test(55));
499+
assertTrue(predicate.test(60));
500+
assertTrue(predicate.test(null));
501+
assertFalse(predicate.test(1001));
502+
assertFalse(predicate.test(1001));
503+
assertTrue(predicate.test(2001));
504+
}
505+
440506
@Test
441507
@SuppressWarnings("unchecked")
442508
public void stackoverflow() {

0 commit comments

Comments
 (0)