我知道的唯一另一种方法是事先进行过滤,即
stream.filter(filterPredicate).collect(collector)
也就是说,尚不清楚您实际上要使用过滤函数做什么,该函数需要三个参数而不是两个参数。
我怀疑您正在尝试将函数映射到与过滤器匹配的元素上,但这本身就是一个映射,您可以很容易地做到这一点:
Collectors.mapping(input -> condition(input) ? function(input) : input, collector)
制作自己的收藏家其实并不难:
static <T, A, R> Collector<T, A, R> filtering(
Predicate<? super T> filter, Collector<T, A, R> collector) {
return Collector.of(
collector.supplier(),
(accumulator, input) -> {
if (filter.test(input)) {
collector.accumulator().accept(accumulator, input);
}
},
collector.combiner(),
collector.finisher());
}