java - 贾弗斯按顺序比较列表

标签 java list java-8 compare javers

我有两个像这样的java类:

public class FooA {
  private List<FooB> fooB;
}

public class FooB {
  private Integer id;
  private String name;
  private double num;
}

我想比较 FooA,它告诉我列表对象中的哪些字段发生了变化。但是当我这样做时:

FooA old = new FooA(Arrays.asList(new FooB(1, "old", 1.0)));
FooA new = new FooA(Arrays.asList(new FooB(1, "new", 1.0)));

Javers javers = JaversBuilder.javers()
          .withListCompareAlgorithm(LEVENSHTEIN_DISTANCE)
          .build();

javers.compare(old, new);

它给了我这个差异:

Diff:
* new object: com.FooA/#fooB/1d32d18fcb3ba2f7f7cb41af6cd96b32
* object removed: com.FooA/#fooB/223ef3c3249fe2898ac3354f9bf42620
* changes on com.FooA/ :
  - 'fooB' collection changes :
    . 'com.FooA/#fooB/223ef3c3249fe2898ac3354f9bf42620' removed
    . 'com.FooA/#fooB/1d32d18fcb3ba2f7f7cb41af6cd96b32' added

我什至尝试在 FooB 上添加 Id,就像我在很多帖子中读到的那样。所以现在我的 foob 看起来像这样:

public class FooB {
  @Id
  private Integer id;
  private String name;
  private double num;
}

但是现在当我比较时我得到这个:

Diff:
* changes on com.FooB/1 :
  - 'name' changed from 'old' to 'new'

它注册为值更改而不是集合更改。我希望差异读起来像这样:

Diff:
* changes on com.FooA/#fooB/1 :
  - 'fooB' collection changes :
    . 'name' changed from 'old' to 'new'

我做错了什么?

最佳答案

使用Javers版本5.2.4:

public class FooA {
    private List<FooB> fooB;

    public FooA(List<FooB> fooB) {
        this.fooB = fooB;
    }
}

public class FooB {
    private Integer id;
    private String name;
    private double num;

    public FooB(Integer id, String name, double num) {
        this.id = id;
        this.name = name;
        this.num = num;
    }
}

void test() {
    FooA old = new FooA(Arrays.asList(new FooB(1, "old", 1.0)));
    FooA new1 = new FooA(Arrays.asList(new FooB(1, "new", 1.0)));

    Javers javers = JaversBuilder.javers()
            .withListCompareAlgorithm(LEVENSHTEIN_DISTANCE)
            .build();

    System.out.println(
            javers.compare(old, new1)
    );
}

方法测试返回:

Diff:
* changes on pl.javers.JaversTest$FooA/ :
  - 'fooB/0.name' changed from 'old' to 'new'

和你想要的几乎一样。

FooA/fooB/0.name -> fooA 具有数组 fooB 并且第一个(索引 0)名称属性已更改

关于java - 贾弗斯按顺序比较列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55031433/

相关文章:

java - 有没有办法使用java流来比较两个字符串?

java - 如何获取先科的ZoneId?

Java - Linux 上的命令行 : I don't have any output after I run the code

java - 如何使用 CriteriaQuery 查询 OneToOne 实体的特定值

list - raku从头开始做转子的更好方法是什么?

python - 递归函数来计算嵌套列表中的所有项目?

java - 使用 void 方法跨 Optional 映射的惯用方式

java - 无法将数据插入android studio sqlite数据库

java - 在java中安排电子邮件通知警报

Python 转换查询输出