diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/PredicateUtil.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/PredicateUtil.java index 4efc35232..580150885 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/func/PredicateUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/PredicateUtil.java @@ -1,16 +1,13 @@ package cn.hutool.core.lang.func; -import cn.hutool.core.collection.ListUtil; -import cn.hutool.core.text.StrUtil; +import cn.hutool.core.stream.StreamUtil; -import java.io.Serializable; -import java.util.List; import java.util.function.Predicate; /** * 一些{@link Predicate}相关封装 * - * @author looly + * @author looly VampireAchao * @since 6.0.0 */ public class PredicateUtil { @@ -26,8 +23,8 @@ public class PredicateUtil { * @param components 多个条件 * @return 复合条件 */ - public static Predicate and(final Iterable> components) { - return new AndPredicate<>(ListUtil.of(components)); + public static Predicate and(final Iterable> components) { + return StreamUtil.of(components, false).reduce(Predicate::and).orElseGet(() -> o -> true); } /** @@ -37,9 +34,9 @@ public class PredicateUtil { * @param components 多个条件 * @return 复合条件 */ - @SuppressWarnings("unchecked") - public static Predicate and(final Predicate... components) { - return new AndPredicate<>(components); + @SafeVarargs + public static Predicate and(final Predicate... components) { + return StreamUtil.of(components).reduce(Predicate::and).orElseGet(() -> o -> true); } /** @@ -49,8 +46,8 @@ public class PredicateUtil { * @param components 多个条件 * @return 复合条件 */ - public static Predicate or(final Iterable> components) { - return new OrPredicate<>(ListUtil.of(components)); + public static Predicate or(final Iterable> components) { + return StreamUtil.of(components, false).reduce(Predicate::or).orElseGet(() -> o -> false); } /** @@ -60,79 +57,8 @@ public class PredicateUtil { * @param components 多个条件 * @return 复合条件 */ - @SuppressWarnings("unchecked") - public static Predicate or(final Predicate... components) { - return new OrPredicate<>(components); - } - - /** - * 多个{@link Predicate}的与,只有所有条件满足才为true,当任意一个条件的test为false,返回false - * - * @param 泛型类型 - * @author Guava - */ - private static class AndPredicate implements Predicate, Serializable { - private static final long serialVersionUID = 1L; - - private final List> components; - - @SafeVarargs - private AndPredicate(final Predicate... components) { - this.components = ListUtil.of(components); - } - - private AndPredicate(final List> components) { - this.components = components; - } - - @Override - public boolean test(final T t) { - // Avoid using the Iterator to avoid generating garbage - //noinspection ForLoopReplaceableByForEach - for (int i = 0; i < components.size(); i++) { - if (false == components.get(i).test(t)) { - return false; - } - } - return true; - } - - @Override - public String toString() { - return "Predicates.and(" + StrUtil.join(",", this.components) + ")"; - } - } - - /** - * 多个{@link Predicate}的或操作,即当一个条件满足,则全部满足,当任意一个条件的test为true,返回true - * - * @param 泛型类型 - * @author Guava - */ - private static class OrPredicate implements Predicate, Serializable { - private static final long serialVersionUID = 1L; - - private final List> components; - - @SafeVarargs - private OrPredicate(final Predicate... components) { - this.components = ListUtil.of(components); - } - - private OrPredicate(final List> components) { - this.components = components; - } - - @Override - public boolean test(final T t) { - // Avoid using the Iterator to avoid generating garbage - //noinspection ForLoopReplaceableByForEach - for (int i = 0; i < components.size(); i++) { - if (false == components.get(i).test(t)) { - return true; - } - } - return false; - } + @SafeVarargs + public static Predicate or(final Predicate... components) { + return StreamUtil.of(components).reduce(Predicate::or).orElseGet(() -> o -> false); } } diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/func/PredicateUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/func/PredicateUtilTest.java index 83d2029a8..9d38c6b72 100644 --- a/hutool-core/src/test/java/cn/hutool/core/lang/func/PredicateUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/func/PredicateUtilTest.java @@ -5,21 +5,52 @@ import org.junit.Assert; import org.junit.Test; import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; +import static cn.hutool.core.lang.func.PredicateUtil.*; + public class PredicateUtilTest { @Test - public void notContainsTest(){ + public void notContainsTest() { final Set sets = SetUtil.of("1", "2", "3"); final List collect = Stream.of("3", "4", "5") - .filter(PredicateUtil.negate(sets::contains)) + .filter(negate(sets::contains)) .collect(Collectors.toList()); Assert.assertEquals(2, collect.size()); Assert.assertEquals("4", collect.get(0)); Assert.assertEquals("5", collect.get(1)); } + + @Test + public void andTest() { + boolean condition = Stream.of(1, 3, 5) + .allMatch( + and( + Objects::nonNull, + i -> i < 10, + i -> i % 2 == 1 + ) + ); + Assert.assertTrue(condition); + } + + @Test + public void orTest() { + boolean condition = Stream.of(1, 3, 5) + .anyMatch( + or( + Objects::isNull, + i -> i > 10, + i -> i % 2 == 0 + ) + ); + Assert.assertFalse(condition); + } + + }