我有一个从数据库收到的DTO列表,他们有一个ID。我想确保我的列表包含具有指定ID的对象。在这种情况下显然创建一个带有期望字段的对象将无济于事,因为contains()调用了Object.equals(),它们将不相等。
我找到了一个类似的解决方案:创建了一个接口HasId
,在我的所有DTO中实现了它,并使用一个具有contains(Long id)
方法的新类继承了ArrayList。
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;
}
}
但是在这种情况下我不能将List和ArrayList强制转换为SearchableList ... 我会忍受这一点,但我想确保我不是在发明自行车。
编辑(2016年10月):
当然,随着Java 8中lambda的引入,这样做的方法很简单:
list.stream().anyMatch(dto -> dto.getId() == id);
答案 0 :(得分:48)
我建议像你写的那样创建简单的静态方法,而不需要任何额外的接口:
public static boolean containsId(List<DTO> list, long id) {
for (DTO object : list) {
if (object.getId() == id) {
return true;
}
}
return false;
}
答案 1 :(得分:8)
我建议您覆盖equals
中的SearchableDto
,例如:{/ p>
public boolean equals(Object o){
if (o instanceof SearchableDto){
SearchableDto temp = (SearchableDto)o;
if (this.id.equals(temp.getId()))
return true;
}
return false;
}
在这种情况下contains
可能有效,如果它具有相同的id
;
答案 2 :(得分:2)
嗯,我认为你的方法有点过于复杂。 你说:
我有一个从数据库收到的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<HasId> list, long id) {
for (HasId object : list) {
if (object.getId() == id) {
return true;
}
}
return false;
}
答案 3 :(得分:1)
这是我在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
函数添加元素属性的条件。
然后根据您的逻辑使用findFirst().get()
或findAny.get()
。
答案 4 :(得分:0)
你的要求对我来说并不清楚。当您说“确保我的列表包含具有指定ID的对象”时,您希望:
大多数回答都假设你的意思是1,但是在考虑它的时候,你可以根据问题的措辞来表达意思。您可以通过更改查询来包含所需的结果:
SELECT * FROM employee WHERE firstname = 'John' OR id = 42;
答案 5 :(得分:0)
public boolean containsId(List<HasId> list, long id) {
boolean flag = false;
for (HasId object : list) {
if (object.getId() == id) {
flag = true;
}
}
return flag;
}