【问题标题】:Java Streams: Extend Built-In CollectorJava Streams:扩展内置收集器
【发布时间】:2020-01-17 20:23:31
【问题描述】:

我想知道是否可以从 java.util.stream.Collectors 类扩展内置的 Java Stream 收集器,而不是从头开始构建自定义收集器,从而复制已经在该类中实现的代码。

例如: 假设我有Stream<Map.Entry<String, Long>> mapEntryStream,我想将其收集到Map<String, Long> 类型的地图中。

当然可以:

mapEntryStream.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

但是假设我想要这样推断的键和条目:

//Not a real Java Collectors method
mapEntryStream.collect(Collectors.toMap());

那么,我如何制作一个像上面那样不带参数但调用Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue) 的收集器?

请注意:这不是关于是否应该制作这样一个收藏家的问题 - 只有当它可以 做出来。

【问题讨论】:

    标签: java java-stream collectors


    【解决方案1】:

    您不能向Collectors 类添加方法。但是,您可以创建自己的实用程序方法来返回您想要的内容:

    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.stream.Collector;
    import java.util.stream.Collectors;
    
    public class MoreCollectors {
    
      public static <K, V> Collector<Entry<K, V>, ?, Map<K, V>> entriesToMap() {
        return Collectors.toMap(Entry::getKey, Entry::getValue);
      }
    }
    

    【讨论】:

    • 哦,这就是我所说的扩展 = 添加我自己的意思。但是,是的,这行得通。谢谢!
    • 是什么让它成为工厂方法?
    • @jaco0646 可能是错误的术语。你会怎么称呼它?实用方法?
    • 是的,我认为实用方法在这里是准确的。
    • @jaco0646 编辑了我的答案。虽然我仍然认为它至少具有工厂方法的一些特征。
    猜你喜欢
    • 1970-01-01
    • 2015-06-19
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多