如何在Kotlin的map函数中通过方法引用调用AppUtils类方法
问题解决:Kotlin中方法引用调用工具类转换函数的正确实现
错误原因
- 原
map函数的lambda参数定义错误:productRepository返回的响应式流发射的元素是Product类型,map的入参只有1个,即上游发射的Product对象,不存在AppUtils类型的入参 - 你当前定义的
entityToDto/dtoToEntity是AppUtils的实例成员方法,必须依托AppUtils实例才能调用,无法直接通过类名引用
解决方案
方案1:修改工具类为伴生对象方法(推荐,无需实例化)
将转换方法放到AppUtils的伴生对象中,可直接通过类名引用方法:
// AppUtils.kt package com.nilmani.reactivespringdemo.Utils import com.nilmani.reactivespringdemo.dto.ProductDto import com.nilmani.reactivespringdemo.entity.Product import org.springframework.beans.BeanUtils class AppUtils { companion object { fun entityToDto(product: Product):ProductDto{ val productDto = ProductDto() BeanUtils.copyProperties(product,productDto) return productDto } fun dtoToEntity(productDto: ProductDto):Product{ val product = Product() BeanUtils.copyProperties(productDto,product) return product } } }
Service中直接使用类名方法引用调用:
// service.kt package com.nilmani.reactivespringdemo.services import com.nilmani.reactivespringdemo.Utils.AppUtils import com.nilmani.reactivespringdemo.dto.ProductDto import com.nilmani.reactivespringdemo.repository.ProductRepository import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Service import reactor.core.publisher.Flux import reactor.core.publisher.Mono @Service class ProductService { @Autowired private lateinit var productRepository: ProductRepository fun getProduct():Flux<ProductDto>{ return productRepository.findAll().map(AppUtils::entityToDto) } fun getProduct(id:String):Mono<ProductDto>{ return productRepository.findById(id).map(AppUtils::entityToDto) } }
方案2:保留实例方法,实例化后引用
如果不需要修改AppUtils的原有结构,先在Service中实例化工具类,再通过实例引用方法:
// service.kt package com.nilmani.reactivespringdemo.services import com.nilmani.reactivespringdemo.Utils.AppUtils import com.nilmani.reactivespringdemo.dto.ProductDto import com.nilmani.reactivespringdemo.repository.ProductRepository import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Service import reactor.core.publisher.Flux import reactor.core.publisher.Mono @Service class ProductService { @Autowired private lateinit var productRepository: ProductRepository // 实例化工具类 private val appUtils = AppUtils() fun getProduct():Flux<ProductDto>{ return productRepository.findAll().map(appUtils::entityToDto) } fun getProduct(id:String):Mono<ProductDto>{ return productRepository.findById(id).map(appUtils::entityToDto) } }
方法引用说明
Kotlin中两种常见方法引用形式:
类名::方法名:用于引用伴生对象方法、顶层函数、静态方法实例对象::方法名:用于引用类的普通成员方法
内容的提问来源于stack exchange,提问作者Mama
相关产品推荐
相关产品推荐

