DBから受け取った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に型キャストすることはできません...私はそれと一緒に暮らしますが、自転車を発明していないことを確認したかったのです。
編集(16年10月):
もちろん、Java 8にラムダを導入すると、これを行う方法は簡単です。
list.stream().anyMatch(dto -> dto.getId() == id);
あなたが書いたような単純な静的メソッドを、追加のインターフェースなしで作成することを提案します。
public static boolean containsId(List<DTO> list, long id) {
for (DTO object : list) {
if (object.getId() == id) {
return true;
}
}
return false;
}
equals
のSearchableDto
をオーバーライドすることをお勧めします。
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
を持っている場合、おそらく動作するはずです。
まあ、あなたのアプローチは問題を少し複雑にしていると思います。あなたが言った:
DBから受け取ったDTOのリストがあり、IDがあります。
次に、おそらくDTOクラスを使用してこれらのアイテムを保持する必要があります。その場合、そのクラス内にid getterおよびsetterを配置します。
public class DTO implements HasId{
void setId(Long id);
Long getId();
}
ArrayListを繰り返し処理して目的のIDを検索するには、これで十分です。 「compare-id」機能を追加するためだけにArrayListクラスを拡張すると、複雑になりすぎます。 @Nikita Beloglazovが良い例です。さらに一般化できます:
public boolean containsId(List<HasId> list, long id) {
for (HasId object : list) {
if (object.getId() == id) {
return true;
}
}
return false;
}
これは、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#のラムダ式は、Javaの場合よりも操作がはるかに簡単です。
filter
関数を使用して、要素のプロパティの条件を追加できます。
次に、ロジックに従ってfindFirst().get()
またはfindAny.get()
を使用します。
あなたの要件は私には明らかではありません。 「指定したIDのオブジェクトがリストに含まれていることを確認する」と言うとき、次のことを行います。
ほとんどの回答は、あなたが1を意味すると仮定していますが、それについて考えるとき、あなたは質問の文言を考えると2を意味することもできます。クエリを変更して、必要な結果を含めることができます。
SELECT * FROM employee WHERE firstname = 'John' OR id = 42;
public boolean containsId(List<HasId> list, long id) {
boolean flag = false;
for (HasId object : list) {
if (object.getId() == id) {
flag = true;
}
}
return flag;
}