我有一个自定义列表,想检查它是否包含特殊项目。该列表填充了Rowlayout
个对象。
public RowLayout(String content, int number) {
this.content = content;
this.number = number;
}
现在我想检查我的List<Roalayout>
是否包含content
位置的特殊项目。我该怎么做?
仅仅询问.contains'
是不行的。
我想检查的内容:
if (!List<RowLayout>.contains("insert here"){
//Do something
}
答案 0 :(得分:7)
如果您可以修改课程RowLayout
,只需覆盖hashCode
和equals
,即可获得您想要的任何相等内容。
如果你不能拥有java-8,可以这样做:
String content = ...
int number = ...
boolean isContained = yourList.stream()
.filter(x -> x.getContent().equals(content))
.filter(x -> x.getNumber() == number)
.findAny()
.isPresent();
您显然可以从Optional
findAny
返回您感兴趣的实例。
答案 1 :(得分:2)
您只需覆盖List.contains
equals
即可正常工作。 List.contains
在文档中说:
当且仅当此列表包含至少一个元素e时,返回true 如此(o == null?e == null: o.equals(e))。
equals
的实施可能如下所示:
class RowLayout {
private String content;
private int number;
public boolean equals(Object o)
{
if (!(o instanceof RowLayout)) return false;
final RowLayout that = (RowLayout) o;
return this.content.equals(that.content) && this.number == that.number;
}
}
不要忘记also override hashCode
,否则您的课程将无法在HashSet
或HashMap
s等基于散列的结构中使用。
使用示例:
myList.contains(new RowLayout("Hello", 99));
另一种Java 8解决方案,如果您只关心内容而不关心这个数字,那就是:
boolean isContained = myList.stream()
.map(RowLayout::getContent)
.anyMatch("some content");