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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:36:02