【问题标题】:Compare two lists of different objects by certain two fields通过某些两个字段比较两个不同对象的列表
【发布时间】:2021-09-02 18:21:56
【问题描述】:

我有两个不同对象的列表

class objectA {
String aId;
String aTitle;
String aUrl;
...
}
class objectB {
String bId;
String bTitle;
String bUrl;
...
}

List<ObjectA> aObjectList;
List<ObjectB> bObjectList;

我需要验证这两个列表的 Id 和 Title 字段的值是否相等。 我看到的方法是从两个列表创建 Map 然后比较它们。

List<Map<String, String>> aObjectMapList = aObjectList.stream()...
List<Map<String, String>> bObjectMapList = bObjectList.stream()...

但也许 assertj 有合适的方法来解决我的问题?

如果通过 stream 或 assertj 或其他方式解决我的问题,我将不胜感激。

【问题讨论】:

  • 列表是否保证大小相同?
  • @MCEmperor 是的,它们从一开始就具有相同的大小。

标签: java java-stream assertj


【解决方案1】:

我会在 2 个列表中为每个对象创建一个字符串 id+title。 然后比较两个列表

List<String> aList = aObjectList.stream()
   .map(a -> a.getaId() + a.getaTitle())
   .collect(Collectors.toList());
List<String> bList = bObjectList.stream()
   .map(b -> b.getbId() + b.getbTitle())
   .collect(Collectors.toList());

boolean sameElements = aList.size() == bList.size() && 
                       aList.containsAll(bList) && 
                       bList.containsAll(aList);

【讨论】:

    【解决方案2】:

    id / title 合并为一个字符串,将输入列表重新映射为List&lt;String&gt;,然后使用 AssertJ hasSameElements 比较新列表:

    assertThat(
        aObjectList.stream()
                   .map(a -> String.join(":", a.aId, a.aTitle))
                   .collect(Collectors.toList())
    ).hasSameElementsAs(
        bObjectList.stream()
                   .map(b -> String.join(":", b.bId, b.bTitle))
                   .collect(Collectors.toList())
    
    );
    
    

    【讨论】:

      猜你喜欢
      • 2023-02-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2022-11-17
      • 2017-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多