我想对一个集合进行分组,但我不希望聚合包含一些值。这样做的最佳解决方案是什么?
解决方案可能是收集器whole_string = " ".join([word.strip() for word in file])
print(whole_string)
,但没有这样的收集器。没有实现自己的收藏家,有没有办法做到这一点?
filtering(Predicate,Collector)
答案 0 :(得分:8)
我唯一知道的另一种方法是事先进行过滤,即
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());
}
答案 1 :(得分:2)
在Java 9中,有一个新的filtering收集器:
Map<Department, Set<Employee>> wellPaidEmployeesByDepartment = employees.stream()
.collect(groupingBy(Employee::getDepartment,
filtering(e -> e.getSalary() > 2000, toSet())));