如何将Stream<Pair<String,String>>分组为Map<String,Set<String>>?
解决Stream聚合
Map<String, Set<String>>的错误问题 嘿,这个问题我之前也碰到过,咱们一步步拆解哪里出错了~
错误原因分析
你尝试使用的三参数Collectors.groupingBy用法不对哦。Java中groupingBy的三参数重载签名是这样的:
public static <T, K, D, A, M extends Map<K, D>> Collector<T, ?, M> groupingBy( Function<? super T, ? extends K> classifier, Supplier<M> mapFactory, Collector<? super T, A, D> downstream )
第二个参数要求是Map的工厂Supplier(比如HashMap::new,用来指定用哪种Map实现),但你传的Pair::getValue是一个需要依赖Pair实例才能调用的实例方法引用——它是个Function<Pair<String,String>, String>,完全不符合Supplier的无参要求。编译器试图把这个方法引用塞进静态上下文的Supplier位置,自然就抛出了“Non-static method cannot be referenced from a static context”的错误。
正确的写法
你真正需要的逻辑是:按Pair的key分组,然后把每组里的Pair转换成对应的value,再将这些value收集成Set。这时候要用到双参数的groupingBy,并在下游收集器中用Collectors.mapping完成元素转换:
Map<String, Set<String>> result = myStream.collect( Collectors.groupingBy( Pair::getKey, // 分组依据:Pair的key Collectors.mapping( Pair::getValue, // 将每个Pair转换为它的value Collectors.toSet() // 把转换后的value收集成Set ) ) );
补充说明
你最开始写的Map<String, Set<Pair<String, String>>>能正常运行,是因为用了双参数的groupingBy——第二个参数直接是Collectors.toSet(),直接把分组里的Pair对象收集成了Set。现在要得到value的集合,就必须在下游收集器里多一步mapping转换,把Pair映射成它的value之后再收集。
内容的提问来源于stack exchange,提问作者Marsellus Wallace
相关产品推荐
相关产品推荐

