如何从Java的自定义谓词列表中创建谓词?

Jan*_*kop 3 java lambda predicate java-8 java-stream

我对编程比较陌生,过去两天我一直想知道如何制作一个由其他Predicates自定义列表组成的谓词.所以我想出了一些解决方案.下面是一个代码片段,可以给你一个想法.因为我是基于单独阅读各种文档而编写的,所以我有两个问题:1 /它是一个很好的解决方案吗?2 /是否有其他一些推荐的解决方案可以解决这个问题?

public class Tester {
  private static ArrayList<Predicate<String>> testerList;

  //some Predicates of type String here...

  public static void addPredicate(Predicate<String> newPredicate) {
    if (testerList == null) 
                 {testerList = new ArrayList<Predicate<String>>();}
    testerList.add(newPredicate);
  }

  public static Predicate<String> customTesters () {
    return s -> testerList.stream().allMatch(t -> t.test(s));

  }
}
Run Code Online (Sandbox Code Playgroud)

Fed*_*ner 5

您可以使用静态方法接收许多谓词并返回所需的谓词:

public static <T> Predicate<T> and(Predicate<T>... predicates) {
    // TODO Handle case when argument is null or empty or has only one element
    return s -> Arrays.stream(predicates).allMatch(t -> t.test(s));
}
Run Code Online (Sandbox Code Playgroud)

一个变种:

public static <T> Predicate<T> and(Predicate<T>... predicates) {
    // TODO Handle case when argument is null or empty or has only one element
    return Arrays.stream(predicates).reduce(t -> true, Predicate::and);
}
Run Code Online (Sandbox Code Playgroud)

我在这里使用Stream.reduce,它将身份和运算符作为参数.Stream.reducePredicate::and运算符应用于流的所有元素以生成结果谓词,并使用该标识对流的第一个元素进行操作.这就是我用作t -> true身份的原因,否则结果谓词最终可能会被评估为false.

用法:

Predicate<String> predicate = and(s -> s.startsWith("a"), s -> s.length() > 4);
Run Code Online (Sandbox Code Playgroud)