我的解决方案有点晚了,不管怎样,我还是把它留在这里。
我有一个想法,写一个建设者来建造一个综合体
Predicate
但最终还是上了一堂课
FilterCondition
和一种方法
FilterCondition.combine
.
Stream.of("123", "1", "12345", "", "12", "", "2")
.filter(FilterCondition.<String>combine(
FilterCondition.of(() -> true, s -> s.contains("3")),
FilterCondition.of(() -> true, s -> s.contains("2")),
FilterCondition.of(() -> false, s -> s.isEmpty())
).toPredicate())
.collect(Collectors.toList());
通过静态导入
FilterCondition.of
FilterCondition.combine,
看起来会更好。
Stream.of("123", "1", "12345", "", "12", "", "2")
.filter(combine(
of(() -> true, s -> s.contains("3")),
of(() -> true, s -> s.contains("2")),
of(() -> false, String::isEmpty)
).toPredicate())
.collect(Collectors.toList());
FilterCondition<T>
基本上是一个
Predicate<T>
predicate
应该应用。
需要一些
过滤条件
class FilterCondition<T> {
private final Supplier<Boolean> filterEnabled;
private final Predicate<T> predicate;
private FilterCondition(Supplier<Boolean> filterEnabled, Predicate<T> predicate) {
this.filterEnabled = filterEnabled;
this.predicate = predicate;
}
public static <T> FilterCondition<T> of(Supplier<Boolean> filterEnabled, Predicate<T> predicate) {
return new FilterCondition<>(filterEnabled, predicate);
}
@SafeVarargs
public static <T> FilterCondition<T> combine(FilterCondition<T>... conditions) {
return new FilterCondition<>(
() -> true,
Arrays.stream(conditions).filter(i -> i.filterEnabled.get()).map(i -> i.predicate).reduce(Predicate::and).orElse(t -> true)
);
}
public Predicate<T> toPredicate() {
return predicate;
}
}