编写一个收集器或嵌套现有的

Write a Collector or nest existing ones

我在数据结构中有一个方法,我希望用它来传递各种收集器并将它们应用于我的对象。

方法如下-->

 public <R> R applyCollector(String key, Collector a)
    {
        this.key = key;
        this.a = a;
        R result = (R) this.stateList.stream().
                map(state -> state.getKey(key)).collect(a);
        return  result;
    }

上面的方法基本上接受了一个 "key" 和一个收集器,它应用于通过键获得的值。

我就是这样使用的 -->

Collector stringToListCollector =
               Collectors.toList();
List<String> values =
               myObject.applyCollector("key",
                       stringToListCollector);

这适用于简单的事情,例如获取计数、平均值等。

但是,如果我想发送更复杂的东西,比如嵌套收集器,该怎么办。 比如说我的"key"returns我是一个String,其实就是一个IP甚至是一个Integer。

我想做的是发送一个收集器,它首先通过执行 "integer::parseInt" 然后执行 toList 将我的字符串转换为整数。

现在我必须首先检索一个名为值的列表(上面定义)。然后做一个values.stream().Map(Integer::ParseString).collect(Collectors::averagingInt).

我可能需要多次执行此操作,我有两个选择。

  1. 将 ToList 和 Map and Collect 作为一个函数。并调用它。这个 超出了我使用 lambda 的目的。

  2. 编写或嵌套现有的收集器来直接为我做这件事。这个 选项对我来说看起来更整洁,因为如果我能正确地做到这一点,我会 能够在一次通行证中完成所有事情,而不是需要 2 次通行证 我现在,也许还可以保存我首先创建一个所需的内存 列表.

我该怎么做?写一个 Collector 做 -->

对于您的示例,它看起来像

applyCollector("key", mapping(Integer::parseInt, averagingInt(i -> i))

收藏家可以在一定程度上组成:

  • Collectors.mapping 收集前执行函数
  • Collectors.collectingAndThen收集后执行函数

另外一些收集器接受下游收集器,即 groupingBy