--- a/jdk/src/share/classes/java/util/function/Predicate.java Tue Feb 19 10:34:26 2013 -0800
+++ b/jdk/src/share/classes/java/util/function/Predicate.java Tue Feb 19 11:56:49 2013 -0800
@@ -24,10 +24,12 @@
*/
package java.util.function;
+import java.util.Objects;
+
/**
* Determines if the input object matches some criteria.
*
- * @param <T> the type of input objects to {@code test}
+ * @param <T> the type of argument to {@code test}
*
* @since 1.8
*/
@@ -42,4 +44,57 @@
* {@code false}
*/
public boolean test(T t);
+
+ /**
+ * Returns a predicate which evaluates to {@code true} only if this
+ * predicate and the provided predicate both evaluate to {@code true}. If
+ * this predicate returns {@code false} then the remaining predicate is not
+ * evaluated.
+ *
+ * @param p a predicate which will be logically-ANDed with this predicate.
+ * @return a new predicate which returns {@code true} only if both
+ * predicates return {@code true}.
+ */
+ public default Predicate<T> and(Predicate<? super T> p) {
+ Objects.requireNonNull(p);
+ return (t) -> test(t) && p.test(t);
+ }
+
+ /**
+ * Returns a predicate which negates the result of this predicate.
+ *
+ * @return a new predicate who's result is always the opposite of this
+ * predicate.
+ */
+ public default Predicate<T> negate() {
+ return (t) -> !test(t);
+ }
+
+ /**
+ * Returns a predicate which evaluates to {@code true} if either this
+ * predicate or the provided predicate evaluates to {@code true}. If this
+ * predicate returns {@code true} then the remaining predicate is not
+ * evaluated.
+ *
+ * @param p a predicate which will be logically-ORed with this predicate.
+ * @return a new predicate which returns {@code true} if either predicate
+ * returns {@code true}.
+ */
+ public default Predicate<T> or(Predicate<? super T> p) {
+ Objects.requireNonNull(p);
+ return (t) -> test(t) || p.test(t);
+ }
+
+ /**
+ * Returns a predicate that evaluates to {@code true} if both or neither of
+ * the component predicates evaluate to {@code true}.
+ *
+ * @param p a predicate which will be logically-XORed with this predicte.
+ * @return a predicate that evaluates to {@code true} if both or neither of
+ * the component predicates evaluate to {@code true}.
+ */
+ public default Predicate<T> xor(Predicate<? super T> p) {
+ Objects.requireNonNull(p);
+ return (t) -> test(t) ^ p.test(t);
+ }
}