找出对象列表是否包含具有指定字段值的内容?
我有一个从数据库收到的DTO列表,他们有一个ID。 我想确保我的列表包含具有指定ID的对象。 显然,在这种情况下使用期望字段创建一个对象将无济于事,因为contains()调用Object.equals(),它们将不相等。
我找到了一个类似的解决方案:创建一个接口HasId
,在我的所有DTO中实现它,并inheritanceArrayList,其中contains(Long id)
一个contains(Long id)
方法的新类。
public interface HasId { void setId(Long id); Long getId(); } public class SearchableList extends ArrayList { public boolean contains(Long id) { for (T o : this) { if (o.getId() == id) return true; } return false; } }
但在这种情况下,我不能将List和ArrayList强制转换为SearchableList ……我会接受它,但我想确保我不是在发明自行车。
编辑(2016年10月):
当然,随着Java 8中lambda的引入,这样做的方法很简单:
list.stream().anyMatch(dto -> dto.getId() == id);
我建议像你写的那样创建简单的静态方法,没有任何额外的接口:
public static boolean containsId(List list, long id) { for (DTO object : list) { if (object.getId() == id) { return true; } } return false; }
我建议你只是覆盖你的SearchableDto
的equals
,它会是这样的:
public boolean equals(Object o){ if (o instanceof SearchableDto){ SearchableDto temp = (SearchableDto)o; if (this.id.equals(temp.getId())) return true; } return false; }
在这种情况下,如果它具有相同的id
,则contains
应该可以工作;
好吧,我认为你的方法有点过于复杂。 你说:
我有一个从数据库收到的DTO列表,他们有一个ID。
那么你可能应该使用DTO类来保存这些项目。 如果是这样,将id getter和setter放在该类中:
public class DTO implements HasId{ void setId(Long id); Long getId(); }
这足以迭代通过和ArrayList并搜索所需的id。 扩展ArrayList类只是为了添加“compare-id”feautre似乎过于复杂了。 @Nikita Beloglazov就是一个很好的例子。 您可以进一步概括它:
public boolean containsId(List list, long id) { for (HasId object : list) { if (object.getId() == id) { return true; } } return false; }
你的要求对我来说并不清楚。 当您说“确保我的列表包含具有指定ID的对象”时,您希望:
- 检测ID是否存在并相应地采取行动
- 始终在结果中包含带有所需ID的DTO
大多数回答都假设你的意思是1,但是在考虑问题时,你可以根据问题的措辞来表达意思。 您可以通过更改查询来包含所需的结果:
SELECT * FROM employee WHERE firstname = 'John' OR id = 42;
public boolean containsId(List list, long id) { boolean flag = false; for (HasId object : list) { if (object.getId() == id) { flag = true; } } return flag; }
这是我在DFS GetUnvisitedNeighbour函数中使用的。
public static int GetUnvisitedNeighbour(int v) { Vertex vertex = VertexList.stream().filter(c -> c.Data == v).findFirst().get(); int position = VertexList.indexOf(vertex); ... }
我曾经在C#工作。 C#中的Lambda表达式比Java中更容易使用。
您可以使用filter
function为元素的属性添加条件。
然后根据你的逻辑使用findFirst().get()
或findAny.get()
。