MyFilter 从Function 继承方法andThen,因此返回类型为Function,不能转换为MyFilter。但由于它具有所需的函数签名,您可以使用 lambda 或方法引用创建 MyFilter 实例。
例如将(f1,f2)->(MyFilter)f1.andThen(f2) 更改为(f1,f2)-> f1.andThen(f2)::apply。
通过此更改,整个方法如下所示:
public static MyObject filterIt(List<MyFilter> filters, MyObject obj) {
Optional<MyFilter> mf =
filters.stream().reduce( (f1,f2)-> f1.andThen(f2)::apply);
return mf.map(f->f.apply(obj)).orElse(obj);
}
但您应该重新考虑您的设计。没有必要让结果函数成为MyFilter的实例,事实上,即使输入也可以放宽以接受不仅仅是List<MyFilter>:
// will accept List<MyFilter> as input
public static MyObject filterIt(
List<? extends Function<MyObject,MyObject>> filters, MyObject obj) {
List<Function<MyObject,MyObject>> l=Collections.unmodifiableList(filters);
Optional<Function<MyObject,MyObject>> mf=l.stream().reduce(Function::andThen);
return mf.orElse(Function.identity()).apply(obj);
}
或者,使用 Stuart Marks 的提示来摆脱 Optional:
// will accept List<MyFilter> as input
public static MyObject filterIt(
List<? extends Function<MyObject,MyObject>> filters,MyObject obj) {
List<Function<MyObject,MyObject>> l=Collections.unmodifiableList(filters);
return l.stream().reduce(Function.identity(), Function::andThen).apply(obj);
}
为了完整起见,您也可以将MyFilters 链接到一个流上,而不是编写一个新函数:
public static MyObject filterIt2(List<MyFilter> filters,MyObject obj) {
Stream<MyObject> s=Stream.of(obj);
for(MyFilter f: filters) s=s.map(f);
return s.findAny().get();
}