'How to get the latest records from the same element in Java?

How can we do it in Java? I've a 4 employee object, I see ssn is same in them, but I want to only get such records where version is latest.

public class MapDemo {
    public static void main(String[] args) {
        // Get the latest Schema version
        Employee employee = Employee.builder().firstName("John").lastname("Do").email("[email protected]").ssn(12345).version(1).build();
        Employee employee1 = Employee.builder().firstName("John").lastname("Doe").email("john.doe@hotmail").ssn(12345).version(2).build();

        Employee employee2 = Employee.builder().firstName("Jane").lastname("K").email("jane.k@gmail").ssn(45678).version(20).build();
        Employee employee3 = Employee.builder().firstName("Jane").lastname("Kerr").email("jane.kerr@gmail").ssn(45678).version(28).build();

        List<Employee> employees = new ArrayList<>();
        employees.add(employee);
        employees.add(employee1);
        employees.add(employee2);
        employees.add(employee3);
        
        // I want latest version employee object here here its - employees1 and employees3
        
    }

Employee.java

@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class Employee {
    private String firstName;
    private String lastname;
    private String email;
    private int version;
    private int ssn;
}


Solution 1:[1]

One way is to use Map.merge:

var ssnToEmployee = new HashMap<Integer, Employee>();
for (var emp: employees)
    ssnToEmployee.merge(emp.getSsn(), emp, (o, n) -> o.getSsn() > n.getSsn() ? o : n);
    
for (var emp: ssnToEmployee.values())
    System.out.println(emp);

Equivalently, you can use streams, in particular the version of Collectors.toMap that takes a merge function:

var ssnToEmployee = employees.stream()
        .collect(Collectors.toMap(Employee::getSsn, e -> e, (o, n) -> o.getSsn() > n.getSsn() ? o : n);
        

(Note: the above doesn't keep the values in any particular sorted order. If you want to preserve the original order of your list, you can use a LinkedHashMap instead.)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1