You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 11:22:33