Вы можете реализовать ключевой метод для идентификации объектов и сравнения их для дублирования.
См. Фрагмент ниже, я использую '_' в качестве разделителя, так как имя и номер телефона не будут содержать этот символ
private class Request {
private final int id;
private final String name;
private final String address;
private final String mobileNumber;
public Request(final int id, final String name, final String address, final String mobileNumber) {
this.id = id;
this.name = name;
this.address = address;
this.mobileNumber = mobileNumber;
}
public String getKey() {
return name + "_" + address+ "_" + mobileNumber;
}
@Override
public String toString() {
return "Request{" +
"id=" + id +
", name='" + name + '\'' +
", address='" + address + '\'' +
", mobileNumber='" + mobileNumber + '\'' +
'}';
}
}
Список можно сгруппировать по ключевой функции, т. Е. Все запросы с одним и тем же ключом будут сгруппированы вместе. Теперь мы можем получить списки, содержащие более одного элемента, чтобы найти дубликаты. См. Нижеприведенный фрагмент кода, который можно использовать для вашего примера.
requests.add(Request1); requests.add(Request2); requests.add(Request3); requests.add(Request4);
final List<Request> duplicateRequests = requests.stream()
.collect(Collectors.groupingBy(Request::getKey)) // group requests by key
.entrySet()
.stream()
.filter(e -> e.getValue().size() > 1) // If duplicates exist
.map(Map.Entry::getValue) // get the duplicate values
.flatMap(List::stream) // collect the duplicates in a new list
.collect(Collectors.toList());
Затем вы можете распечатать список дубликатов с помощью следующего фрагмента:
duplicateRequests.stream().forEach(System.out::println);
И выводится:
Request{id=1, name='peter', address='mumbai', mobileNumber='9439264054'}
Request{id=2, name='peter', address='mumbai', mobileNumber='9439264054'}