Java Stream 合并两个Map

文章讲述了如何利用Java的StreamAPI优雅地合并两个Map对象,特别是当Map的值是Set类型时。通过Stream的flatMap和collect方法,以及Collectors.toMap函数,实现了当键相同的情况下来合并Set值,避免了硬编码的复杂性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天有一个场景,需要将两个Map合并,示例数据如下:

# Map1
{
    "1000":[
        "101",
        "102",
        "103"
    ],
    "1001":[
        "201",
        "202"
    ]
}

# Map2
{
    "1000":[
        "102",
        "103",
        "104"
    ],
    "1002":[
        "301",
        "302"
    ]
}
# 合并后的结果
{
    "1000":[
        "101",
        "102",
        "103",
        "104"
    ],
    "1001":[
        "201",
        "202"
    ],
    "1002":[
        "301",
        "302"
    ]
}

如果硬写的话还是比较麻烦,但是使用Stream流可以很方便的完成这个操作

Map<String, Set<String>> oldData = JSON.parseObject("{\"1000\":[101,102,103],\"1001\":[201,202]}", new TypeReference<Map<String, Set<String>>>() {
});
Map<String, Set<String>> newData = JSON.parseObject("{\"1000\":[102,103,104],\"1002\":[301,302]}", new TypeReference<Map<String, Set<String>>>() {
});
Map<String, Set<String>> finalMap = Stream.of(oldData, newData)
		.flatMap(map -> map.entrySet().stream())
		.collect(
				Collectors.toMap(
						Map.Entry::getKey,
						Map.Entry::getValue,
						(set1, set2) -> {
							Set<String> mergeSet = new HashSet<>(set1);
							mergeSet.addAll(set2);
							return mergeSet;
						}
				)
		);
;

需要特别说明的是 Collectors.toMap( )中的第三个参数是Key相同情况下的处理规则,上图的代码意思就是如果这两个Map的Key相同,则把两个Key对应的Value放入同一个Set中返回

### TransformerQKV 的概念和作用 #### 查询 (Query, Q) 查询向量表示当前关注的词语或位置的兴趣点。对于句子中的每一个词,都会生成一个对应的查询向量来表达该词希望获取的信息方向。例如,在分析单词 "machines" 时,其查询向量旨在捕捉有关此词的相关背景信息。 ```python query_vector_machines = word_embedding("machines") @ W_Q ``` 这里 `W_Q` 是一个可训练参数矩阵,用来转换原始词嵌入到查询空间中[^1]。 #### 键 (Key, K) 键向量则对应着整个输入序列里各个部分所能提供给其他成分的信息线索。每个词都有自己的键向量,它反映了这个词可以贡献哪些特征供他人参考。当试图理解某个特定词汇的意义时,会拿这个目标词汇的查询向量去匹配所有可能关联项所提供的键向量。 ```python key_vectors = [ word_embedding("thinking") @ W_K, word_embedding("machines") @ W_K ] ``` 同样的,`W_K` 表示另一个独立学习得到的投影矩阵,负责把标准词嵌入映射成适合做对比操作的形式[^2]。 #### 值 (Value, V) 一旦确定了最有可能影响当前节点解释性的若干候选对象之后,则需进一步评估这些选项究竟携带了多少有用的内容——这便是值的作用所在。简单来说,如果某一部分被认为对解答问题至关重要的话,那么它的值就会被赋予较高的权重;反之亦然。最终,通过对一系列经过筛选后的值进行加权平均运算得出的结果构成了自注意力层的主要输出形式之一。 ```python value_vectors = [ word_embedding("thinking") @ W_V, word_embedding("machines") @ W_V ] attention_weights = softmax(query_vector_machines @ key_vectors.T / sqrt(d_k)) output_representation = attention_weights @ value_vectors ``` 其中 `d_k` 是键向量的维度大小,而 `softmax()` 函数确保了不同位置之间的相对重要程度总和为一。上述过程展示了如何利用软性选择机制从众多备选方案当中提炼出最具代表性和影响力的片段作为下一步工作的基础[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值