Java8, 有过滤收集器吗?
Java8, Is there a filtering collector?
我想对集合进行分组,但我不希望聚合包含某些值。最好的解决方案是什么?
一个解决方案可以是一个收集器 filtering(Predicate,Collector)
但没有这样的收集器。有没有办法在不实现自己的收集器的情况下做到这一点?
IntStream.range(0,100).collect(
groupingBy(
i -> i % 3,
HashMap::new,
filtering( i -> i % 2 == 0, toSet() )
)
);
我知道的唯一其他方法是预先进行过滤,即
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());
}
在 Java 9 中有一个新的 filtering 收集器:
Map<Department, Set<Employee>> wellPaidEmployeesByDepartment = employees.stream()
.collect(groupingBy(Employee::getDepartment,
filtering(e -> e.getSalary() > 2000, toSet())));
我想对集合进行分组,但我不希望聚合包含某些值。最好的解决方案是什么?
一个解决方案可以是一个收集器 filtering(Predicate,Collector)
但没有这样的收集器。有没有办法在不实现自己的收集器的情况下做到这一点?
IntStream.range(0,100).collect(
groupingBy(
i -> i % 3,
HashMap::new,
filtering( i -> i % 2 == 0, toSet() )
)
);
我知道的唯一其他方法是预先进行过滤,即
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());
}
在 Java 9 中有一个新的 filtering 收集器:
Map<Department, Set<Employee>> wellPaidEmployeesByDepartment = employees.stream()
.collect(groupingBy(Employee::getDepartment,
filtering(e -> e.getSalary() > 2000, toSet())));