Search code examples
javajava-streamassertj

Compare two lists of different objects by certain two fields


I have two lists of different objects

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

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

I need to verify that these two lists have equal values for Id and Title fields. The way I see is to create Map<String, String> from two lists and then compare them.

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

But maybe assertj has an appropriate approach to solve my issue?

I would be grateful for any solution to my issue via stream or assertj or somehow else.


Solution

  • It could make sense to merge id / title into a single String, remap the input lists into List<String> and then use AssertJ hasSameElements to compare the new lists:

    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())
    
    );