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

我试图操纵数据的结构,以便我可以将它传递给这个函数fun handleRequests(messages: Map<MessageDestination, List<MessageSender>>): Either<Errors.RequestError, Unit>。但我不断收到此错误: syntaxerror


Error:(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.handlers


import arrow.core.Either

import arrow.core.flatMap

import com.amazonaws.services.lambda.runtime.Context

import com.amazonaws.services.lambda.runtime.RequestHandler


interface 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)


潇湘沐
浏览 341回答 1
1回答

holdtom

您想转换按列表分组的值,因此:emailMesssages.groupBy(&nbsp;&nbsp; &nbsp; { MessageDestination(it.second) },&nbsp; &nbsp; { 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(&nbsp; &nbsp; keySelector: (T) -> K,&nbsp; &nbsp; valueTransform: (T) -> V): Map<K, List<V>> (source)`在你的情况下,这看起来像这样:emailMesssages.groupBy(&nbsp;&nbsp; &nbsp; { MessageDestination(it.second) },&nbsp; &nbsp; { it.first })
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java