В модульном тесте я хочу проверить, что два списка содержат одни и те же элементы. Список для тестирования состоит из списка объектов Person
, где извлекается одно поле типа String
. В другом списке содержится String
литералов.Java 8: Более эффективный способ сравнения списков разных типов?
Часто находит следующий фрагмент кода для выполнения этой задачи (см this answer):
List<Person> people = getPeopleFromDatabasePseudoMethod();
List<String> expectedValues = Arrays.asList("john", "joe", "bill");
assertTrue(people.stream().map(person -> person.getName()).collect(Collectors.toList()).containsAll(expectedValues));
Person
класс defiend как:
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
// other getters and setters
}
В приведенном выше примере, список лиц, (или люди) преобразуется в список строк с использованием методов Java 8, и сравнение выполняется по-старому.
Теперь интересно, если есть более прямой или более эффективный способ сравнения, используя другие операторы Java 8, например allMatch()
или некоторые Predicate<T>
или что-то еще.
Почему бы не использовать [Hamcrest] (http://hamcrest.org/) вместо них? – Makoto
Вы действительно хотите проверить 'containsAll'? Значит, порядок и размер списков могут быть разными? –
@TagirValeev Я хочу, чтобы «List people» содержал всех людей, которые я указывал в статическом списке, сравнивая их уникальные имена. Таким образом, порядок списков может отличаться, но для успешного утверждения размер списков должен быть одинаковым. –