按 <String, Set<String>> 的地图过滤传入事件
Filter incoming event by Map of <String, Set<String>>
我正在寻找一种方法来巧妙地过滤事件中的值并基于它们创建地图。
我们需要知道的:
事件:
该事件包含字典数据结构(它是 的映射,其中键是产品参数名称。
例如:
一)
Key: Brand,
Value: Nike
b)
Key: Producer,
Value: Audi
- 过滤器:
过滤器是 Map<String, Set<String>>
并且在 yml 中配置。
值示例:
Key: Manufacturer,
Value: [Brand, Producer, Creator, Author]
- 实体:
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
)
- 值被过滤。假设我们只有一个过滤器 - 它的键 = 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)
我正在寻找一种方法来巧妙地过滤事件中的值并基于它们创建地图。 我们需要知道的:
事件:
该事件包含字典数据结构(它是
例如: 一)
Key: Brand,
Value: Nike
b)
Key: Producer,
Value: Audi
- 过滤器:
过滤器是 Map<String, Set<String>>
并且在 yml 中配置。
值示例:
Key: Manufacturer,
Value: [Brand, Producer, Creator, Author]
- 实体:
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
)
- 值被过滤。假设我们只有一个过滤器 - 它的键 = 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)