使用eo-yaml设置overrideConflicts=true仍无法替换YamlSequence
eo-yaml中替换YamlSequence而非合并的解决方法
问题重现
使用eo-yaml库时,尝试通过MergedYamlMapping并设置overrideConflicts=true来替换原有YamlSequence,但运行结果是新旧序列元素被合并而非替换:
原代码:
final YamlMapping original = Yaml.createYamlMappingBuilder() .add( "some_key", Yaml.createYamlSequenceBuilder().add("one").add("two").build() ) .build(); final YamlMapping updated = new MergedYamlMapping( original, () -> Yaml.createYamlMappingBuilder() .add( "some_key", Yaml.createYamlSequenceBuilder().add("three").add("four").build() ).build(), true ); System.out.println(updated);
输出结果(序列被合并):
some_key: - one - two - three - four
原因
MergedYamlMapping的overrideConflicts=true参数仅作用于映射键的冲突处理(即当左右映射有相同键时,用右侧值覆盖左侧),但对于序列类型的键值,eo-yaml默认的合并逻辑是将右侧序列的元素追加到左侧序列中,而非直接替换整个序列。
解决方案
方案1:直接构建新映射覆盖目标键
如果只需要替换特定键的序列,可以直接构建新的YamlMapping,保留原映射的其他键,仅替换目标键的序列:
final YamlMapping updated = Yaml.createYamlMappingBuilder() // 保留原映射中除"some_key"外的所有键值对 .addAll(original.entrySet().stream() .filter(entry -> !"some_key".equals(entry.getKey().getValue())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))) // 添加新的序列覆盖原键 .add("some_key", Yaml.createYamlSequenceBuilder().add("three").add("four").build()) .build();
方案2:自定义合并策略
如果需要更通用的序列替换逻辑,可以通过自定义MergeStrategy来控制序列类型的冲突处理:
final YamlMapping updated = new MergedYamlMapping( original, () -> Yaml.createYamlMappingBuilder() .add("some_key", Yaml.createYamlSequenceBuilder().add("three").add("four").build()) .build(), (left, right) -> { // 当右侧值为序列时,直接用右侧替换左侧 if (right instanceof YamlSequence) { return right; } // 其他类型采用默认的覆盖逻辑 return left.isConflict(right) ? right : left.merge(right); } );
以上两种方式运行后,输出都会是:
some_key: - three - four
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

