【问题标题】:Accept multiple predicates as argument to method接受多个谓词作为方法的参数
【发布时间】:2017-10-09 10:32:09
【问题描述】:

我对 Java 还是很陌生,并且学习了一个课程来更好地理解它。在下面的Test code 中,我们应该能够创建一个接受多个Predicate 的方法。我似乎无法正确处理。 Collections 看起来合乎逻辑,但不能使用。所以我认为Predicate<T>[] predicates 就足够了。但那里没有成功。

public class Utils {
//    public static <T> Predicate<T> anyPassPredicate(Predicate<T>[] predicates) {
    public static <T> Predicate<T> anyPassPredicate(Collection<Predicate<T>> predicates) {
        Predicate<T> pred = predicates.stream().reduce(Predicate::or).orElse(x->false);;
        return pred;
    }

    public static <T> T firstAnyMatch(List<T> list, Predicate<T> predicate) {
        for (T element : list) {
            if (predicate.test(element)) {
                return element;
            }
        }
        return null;
    }
}

测试代码

public class Test {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("Jan", "Jos", "Anna", "Pieter", "Johan");
        Predicate<String> anyMatch = Utils.anyPassPredicate(s -> s.contains("o"), s -> s.length() > 5);
        Utils.firstAnyMatch(words, anyMatch);
    }
}

如何接受多个Predicate 作为方法的参数?

【问题讨论】:

  • 您可能正在寻找可变参数

标签: java generics predicate


【解决方案1】:

为了让方法接受未指定数量的相同类型的参数,您需要使用varargs,它由省略号指定

static <T> Predicate<T> anyPassPredicate(Predicate<T>... predicates) {
    return Arrays.stream(predicates)
         .reduce(Predicate::or)
         .orElse(x->false);
}

【讨论】:

  • 谢谢约瑟夫。确实修复了它。
  • 你可能想用SafeVarargs注释它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
相关资源
最近更新 更多