我正在尝试操纵数据结构,以便可以将其传递给此函数 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)
class ServiceImpl : InterfaceService {
override fun handleRequests(messages: Map<MessageDestination, List<MessageSender>>): Either<Errors.RequestError, Unit> {
TODO("logic goes her")
}
companion object {
enum class EmailType {
M1, M2
}
}
}
object Errors {
interface RequestError {
val message: String
}
data class UnexpectedError(override val message: String) : RequestError
}
最佳答案
TL;博士: 您想要转换列表中分组的值,因此:
emailMesssages.groupBy(
{ MessageDestination(it.second) },
{ it.first }
)
长版:
好的,那么你可以从以下开始:
emailMesssages: List<Pair<MessageSender, String>>
并且您想将其转换为类型 Map<MessageDestination, List<MessageSender>>
您正在尝试使用 emailMesssages.groupBy { MessageDestination(it.second) }
来实现这一目标。什么groupBy
它是否按您指定的键对列表中的项目进行分组。重要的是,它将一键的所有项目(在本例中为所有 Pair
)组合到列表中。
因此,如果您有(来自 official docs 的示例):
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")
这解释了为什么您输入 Map<MessageDestination, List<Pair<MessageSender, String>>>
而不是Map<MessageDestination, List<MessageSender>>
.
您想要做的是不对列表中的项目进行分组,您想要对列表中的项目转换后的值进行分组。
基本上你想要的是 'groupBy' 的另一个变体使用 keySelector 和 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 }
)
关于java - 错误 Kotlin 类型推断失败 预期类型不匹配 Map<MessageDestination, List<MessageSender>> 是预期的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52636018/