You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 02:32:23