Java8,有过滤收集器吗?

标签 java predicates collectors

我想对一个集合进行分组,但我不希望聚合包含某些值。最好的解决方案是什么?

解决方案可以是收集器 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());
}

关于Java8,有过滤收集器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33001883/

相关文章:

c# - 如何在 C#/Visual Studio 中调试谓词?

java - 使用 Collectors 将 Steam 拆分为基于 Java 类的列表

Java Stream API : what kind of map method collect(Collectors. toMap()) 返回?

java - 将自定义标记添加到 Android 中的 Google map

java - Java 中的 LIKE 谓词。它存在吗?

functional-programming - 使用多图收集器收集线

java - 为什么我的程序不能运行java循环中的内容?

java - 错误 [SoapUI] 发生错误 [找不到适合 jdbc :oracle:thin:@//174. 23.0.187:1111/qwe 的驱动程序]

java - 未加载 log4j2 配置