Vert.x Reactive中Collector实例化及测试编译错误问题
解决Collector实例化的"Can not resolve apply"编译错误
让我们一步步拆解问题根源,然后给出针对性的修复方案:
错误根源分析
你遇到的编译错误主要来自三个核心问题:
- Collector参数签名不匹配:你把
DataMapper::apply作为finisher参数传入,但finisher的作用是将中间容器(DataCollector)转换为最终结果(List<Temp>),而DataMapper::apply是用来处理单个Row的,完全不符合finisher的函数签名要求。 - 容器与元素类型不兼容:你的Collector泛型定义是
Collector<Row, ?, List<Temp>>,意味着累加器需要处理Row类型元素,但当前DataCollector的accept方法只接受Temp类型,无法直接对接。 - 原始类型导致类型推断失败:
DataMapper继承了原始类型Function,没有指定泛型参数,编译器无法正确推断Collector的类型参数,进而触发"Can not resolve apply"错误。
分步修复方案
1. 修复DataMapper的泛型类型
把DataMapper改成带明确泛型的Function,让编译器能识别它的输入输出类型:
class DataMapper implements Function<Row, Temp> { @Override public Temp apply(Row row) { String data = row.getString("data"); String extra = row.getString("extra"); return new Temp(extra, data); } }
2. 调整DataCollector的累加逻辑
有两种方式让DataCollector能处理Row元素:
方案一:修改DataCollector的accept方法(推荐)
直接让accept方法接收Row,内部完成转换:
class DataCollector { private List<Temp> tempList = new ArrayList<>(); // 修改accept方法,直接处理Row类型 public void accept(Row row) { Temp temp = new DataMapper().apply(row); tempList.add(temp); } DataCollector combine(DataCollector collector){ this.tempList.addAll(collector.list()); return this; } public List<Temp> list(){ return this.tempList; } // 修正拼写错误:charactoristics -> characteristics public Set<Collector.Characteristics> characteristics(){ return Collections.emptySet(); } }
方案二:保留原DataCollector,在累加器中手动转换
如果不想修改DataCollector,可以在Collector的累加器参数中用lambda完成Row到Temp的转换:
// 后续Collector实例化时,累加器用这个lambda (collector, row) -> collector.accept(new DataMapper().apply(row))
3. 修正Collector.of的参数匹配
现在我们可以正确实例化符合要求的Collector了:
用方案一的修复(修改了DataCollector):
Collector<Row, DataCollector, List<Temp>> collector = Collector.of( DataCollector::new, // 供应商:创建中间容器实例 DataCollector::accept, // 累加器:处理Row并添加到容器 DataCollector::combine, // 组合器:合并两个容器 DataCollector::list, // 完成器:将容器转为最终List<Temp> DataCollector::characteristics // 特性集 );
用方案二的修复(保留原DataCollector):
Collector<Row, DataCollector, List<Temp>> collector = Collector.of( DataCollector::new, (collector, row) -> collector.accept(new DataMapper().apply(row)), // 手动转换Row为Temp DataCollector::combine, DataCollector::list, DataCollector::characteristics );
额外注意点
- 修正了
DataCollector中charactoristics的拼写错误(少了一个r),虽然这不会导致编译错误,但属于代码规范问题。 - 现在编译器可以正确推断所有类型参数,"Can not resolve apply"的错误应该会消失。
内容的提问来源于stack exchange,提问作者Tharanga
相关产品推荐
相关产品推荐

