I have a list of DTO received from a DB, and they have an ID. I want to ensure that my list contains an object with a specified ID. Apparently creating an object with expected fields in this case won't help because contains() calls for Object.equals(), and they won't be equal.
I came up to a solution like so: created an interface HasId
, implemented it in all my DTOs, and inherited ArrayList with a new class that has contains(Long id)
method.
public interface HasId { void setId(Long id); Long getId(); } public class SearchableList<T extends HasId> extends ArrayList<T> { public boolean contains(Long id) { for (T o : this) { if (o.getId() == id) return true; } return false; } }
But in this case I can't typecast List and ArrayList to SearchableList... I'd live with that, but wanted to make sure that I'm not inventing the wheel.
EDIT (Oct '16):
Of course, with the introduction of lambdas in Java 8 the way to do this is straightforward:
list.stream().anyMatch(dto -> dto.getId() == id);
You can use the Enumerable. Where extension method: var matches = myList.
contains() method can be used to check if a Java ArrayList contains a given item or not. This method has a single parameter i.e. the item whose presence in the ArrayList is tested. Also it returns true if the item is present in the ArrayList and false if the item is not present.
The list of all declared fields can be obtained using the java. lang. Class. getDeclaredFields() method as it returns an array of field objects.
I propose to create simple static method like you wrote, without any additional interfaces:
public static boolean containsId(List<DTO> list, long id) { for (DTO object : list) { if (object.getId() == id) { return true; } } return false; }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With