RxJava代码编译报错:无法找到concatMap符号求助
问题原因
RxJava 2里Single类没有concatMap方法,这个操作符是Observable专属的。你的listObjects返回的是Single<ListObjectsV2Response>,直接调用concatMap肯定会触发编译错误。
解决办法
把concatMap替换成concatMapObservable(推荐)或者flatMapObservable,这两个是Single类支持的操作符,能把Single发射的单个数据转换成Observable流,刚好适配你后续处理文件列表的逻辑。
修改后的完整代码:
private Single<CopyObjectResponse> copyObjectsRecursively(String sourceBucketName, String sourceKeyPrefix,String destinationBucketName, String destinationKeyPrefix) { return listObjects(sourceKeyPrefix, sourceBucketName) // 替换concatMap为concatMapObservable,适配Single类型 .concatMapObservable(listObjectsV2Response -> Observable.fromIterable(listObjectsV2Response.contents()) .flatMapSingle(s3Object -> { if (s3Object.key().endsWith("/")) { String newSourceKey = s3Object.key(); String newDestinationKey = buildDestinationKey(destinationKeyPrefix, newSourceKey, sourceKeyPrefix); return copyObjectsRecursively(sourceBucketName, newSourceKey, destinationBucketName, newDestinationKey); } else { CopyObjectRequest copyRequest = CopyObjectRequest.builder() .sourceBucket(sourceBucketName) .sourceKey(s3Object.key()) .destinationBucket(destinationBucketName) .destinationKey(buildDestinationKey(destinationKeyPrefix, s3Object.key(), sourceKeyPrefix)) .build(); return Single.fromFuture(buildClient.copyObject(copyRequest)); } })) .ignoreElements() .toSingleDefault(null) .onErrorResumeNext(error -> Single.error(error)); }
额外说明
concatMapObservable会保证所有转换后的Observable按顺序执行,适合文件复制这种需要保持目录结构顺序的场景;- 如果不在乎复制顺序追求速度,可以用
flatMapObservable,它会并行处理多个Observable,但复制完成的顺序可能会打乱。
内容的提问来源于stack exchange,提问作者Satyam Kumar
相关产品推荐
相关产品推荐

