为了账号安全,请及时绑定邮箱和手机立即绑定

错误 Kotlin 类型推断失败预期类型不匹配 Map<MessageDestination

错误 Kotlin 类型推断失败预期类型不匹配 Map<MessageDestination

潇湘沐 2021-10-27 16:22:49
我试图操纵数据的结构,以便我可以将它传递给这个函数fun handleRequests(messages: Map<MessageDestination, List<MessageSender>>): Either<Errors.RequestError, Unit>。但我不断收到此错误: syntaxerrorError:(27, 63) Kotlin: Type inference failed. Expected type mismatch: inferred type is Map<MessageDestination, List<Pair<MessageSender, String>>> but Map<MessageDestination, List<MessageSender>> was expected.我需要将我的数据转换为,Map<MessageDestination, List<MessageSender>>但我不知道该怎么做。这是代码:package testp.package1.handlersimport arrow.core.Eitherimport arrow.core.flatMapimport com.amazonaws.services.lambda.runtime.Contextimport com.amazonaws.services.lambda.runtime.RequestHandlerinterface InterfaceService {    fun handleRequests(messages: Map<MessageDestination, List<MessageSender>>): Either<Errors.RequestError, Unit>}abstract class AbstractMessageHandler(        override val service: InterfaceService =                ServiceImpl()) : MessageHandler<MyMessage>() {    abstract val emailType: ServiceImpl.Companion.EmailType    override val emailParser: IMessageParser<MyMessage> = M2MessageParser()    override fun handle(event: List<String>): Either<Errors.RequestError, Pair<List<Errors.RequestError>, Int>> =            emailParser.parseEmails(event)                    .map { (error, messages) ->                        error to messages.map { myMessage ->                            MessageSender(message = myMessage.environment) to myMessage.emailAdrress                        }                    }                    .flatMap { (errors: List<Errors.RequestError>, emailMesssages: List<Pair<MessageSender, String>>) ->                        service.handleRequests(emailMesssages.groupBy { MessageDestination(it.second) }).map {                            Pair(errors, emailMesssages.size)                        }                    }}data class MessageDestination(val emailAddress: String)data class MyMessage(val environment: String, val emailAdrress: String, val phoneId: String)data class MessageSender(val message: String)
查看完整描述

1 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

您想转换按列表分组的值,因此:


emailMesssages.groupBy( 

    { MessageDestination(it.second) },

    { it.first }

)

长版:


好的,所以你开始: emailMesssages: List<Pair<MessageSender, String>> 并且你想把它转换成类型Map<MessageDestination, List<MessageSender>>


您正试图通过emailMesssages.groupBy { MessageDestination(it.second) }. groupBy它按您指定的键对列表中的项目进行了哪些分组。重要的是它将Pair一个键的所有项目(在本例中为所有s)组合到列表中。


所以如果你有(来自官方文档的样本):


val words = listOf("a", "abc", "ab", "def", "bc")

val byLength = words.groupBy { it.length }

然后 byLength 是:


1 -> listOf("a")

2 -> listOf("ab", "bc")

3 -> listOf("abc", "def")

这解释了为什么你有 typeMap<MessageDestination, List<Pair<MessageSender, String>>>而不是Map<MessageDestination, List<MessageSender>>.


您想要做的不是对列表中的项目进行分组,而是希望对列表中的项目中的转换值进行分组。


基本上你想要的是'groupBy'的另一个变体,带有keySelector AND valueTransform:


inline fun <T, K, V> Array<out T>.groupBy(

    keySelector: (T) -> K,

    valueTransform: (T) -> V

): Map<K, List<V>> (source)`

在你的情况下,这看起来像这样:


emailMesssages.groupBy( 

    { MessageDestination(it.second) },

    { it.first }

)


查看完整回答
反对 回复 2021-10-27
  • 1 回答
  • 0 关注
  • 340 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信