按 <String, Set<String>> 的地图过滤传入事件

Filter incoming event by Map of <String, Set<String>>

我正在寻找一种方法来巧妙地过滤事件中的值并基于它们创建地图。 我们需要知道的:

事件: 该事件包含字典数据结构(它是 的映射,其中键是产品参数名称。

例如: 一)

Key: Brand, 
Value: Nike

b)

Key: Producer,
Value: Audi
  1. 过滤器:

过滤器是 Map<String, Set<String>> 并且在 yml 中配置。

值示例:

Key: Manufacturer,
Value: [Brand, Producer, Creator, Author]
  1. 实体:
data class Product(
    val id: String,
    val parameters: Map<String, Parameter> = emptyMap()
) 
data class Parameter(
        val parameterId: String?,
        val parameterValue: String)

流程如何:

1)一个事件带有一个参数列表,例如

mapOf(
"brand" to "Nike",
"size" to "42",
"color" to "black
)
  1. 值被过滤。假设我们只有一个过滤器 - 它的键 = Manufacturer,它的值 = [Brand, Producer, Creator, Author]。 所以从这个事件中我们只有一个位置 - 它的 mapOf("brand" to "Nike") 在过滤期间,在域对象 [Product] 中创建一个映射,其中填充了字段参数:Map 例如
mapOf("Manufacturer" to Parameter(null, "Nike"))

如您所见 - 制造商而非品牌被选为产品对象映射中的键(即此参数的键,而不是值)。

目标:

过滤事件的方法应该是什么样的?如何以巧妙的 Kotlin 方式进行(使用 Map 为传入地图过滤数据并基于它创建目标对象。 )

提前感谢 help/advice!

编辑: 更多信息:
示例输入:
出现在域端的传入事件:

ProductCreatedEvent( id = "1234", mapOf("brand" to "Nike", "color" to "black, "size" to "46"))

示例输出:

Product(id = "1234", mapOf("Manufacturer" to "Nike"))

传入事件已被结构为 Map <String, Set <String>>

的过滤器过滤

过滤器的结构取决于数据来自不同来源的事实,因此,例如,供应商端的“制造商”键可能被称为“品牌”或“生产商”。在我的服务方面,它是标准化的,因此在域对象的参数映射中选择每个键的键值。

这应该有效

val event = ProductCreatedEvent( id = "1234", mapOf("Brand" to "Nike", "Color" to "Black", "Size" to "46"))

val filters = mapOf("Manufacturer" to setOf("Brand", "Producer", "Creator", "Author"))

val parameters = event.params.mapNotNull { param ->
    filters.entries.find { it.value.contains(param.key) }
        ?.let {  it.key to param.value }
}.toMap()
val product = Product(event.id, parameters)