找出对象列表是否包含具有指定字段值的内容?

我有一个从数据库收到的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; } 

我建议你只是覆盖你的SearchableDtoequals ,它会是这样的:

 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的对象”时,您希望:

  1. 检测ID是否存在并相应地采取行动
  2. 始终在结果中包含带有所需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中更容易使用。

您可以使用filterfunction为元素的属性添加条件。

然后根据你的逻辑使用findFirst().get()findAny.get()