我对编程比较陌生,过去两天我一直想知道如何制作一个由其他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));
}
}
答案 0 :(得分: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));
}
变体:
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);
}
这里我使用Stream.reduce
,它将身份和运算符作为参数。 Stream.reduce
将Predicate::and
运算符应用于流的所有元素以生成结果谓词,并使用该标识对流的第一个元素进行操作。这就是我使用t -> true
作为标识的原因,否则结果谓词最终可能会评估为false
。
用法:
Predicate<String> predicate = and(s -> s.startsWith("a"), s -> s.length() > 4);
答案 1 :(得分:1)
示例:
Predicate<String> a = str -> str != null;
Predicate<String> b = str -> str.length() != 0;
Predicate<String> c = a.and(b);
c.test("Str");
//stupid test but you see the idea :)