Java 检查对象列表是否包含字符串
我有下面的类,其中包含字段名称和id-Java 检查对象列表是否包含字符串,java,Java,我有下面的类,其中包含字段名称和id- public class MyObj { private String name; private String id; //getters and setters + toString implementation } 在我的主要方法中,我创建了一个MyObj列表,并向列表中添加元素 public static void main(String[] args) { List<
public class MyObj {
private String name;
private String id;
//getters and setters + toString implementation
}
在我的主要方法中,我创建了一个MyObj
列表,并向列表中添加元素
public static void main(String[] args) {
List<MyObj> myList = new ArrayList<MyObj>();
MyObj myObj1 = new MyObj();
myObj1.setName("test");
myObj1.setId("123");
myList.add(myObj1);
MyObj myObj2 = new MyObj();
myObj2.setName("testOne");
myObj2.setId("456");
myList.add(myObj2);
}
我想检查我的列表是否有字符串。例如,它是否包含名称或id?当我使用contains方法时,它返回false。很明显我做错了什么。如何检查对象列表是否有字符串?您需要在MyObj中实现equals方法您可能需要类似Java8流和过滤器的东西,但如果我理解您的问题(以及答案和注释),您希望得到所有符合条件的MyObj 在这种情况下,
等于
不是这样做的方法。例如:
MyObj a = ...
a.setName("A");
a.equals("A"); // returns true
"A".equals(a); // returns false!
的javadoc说:
equals方法在非null上实现等价关系
对象引用:
- 它是自反的:对于任何非空参考值x,x.equals(x)应该返回true
- 它是对称的:对于任何非空参考值x和y,当且仅当y.equals(x)返回true时,x.equals(y)才应返回true。
- 它是可传递的:对于任何非空引用值x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)应该返回true
- 它是一致的:对于任何非空的引用值x和y,x.equals(y)的多次调用始终返回true或true 如果没有在equals中使用信息,则始终返回false 修改对象上的比较。 对于任何非空引用值x,x.equals(null)应返回false
Stream
在Java8之前的版本中,for循环或外部库(如Guava)是最好的选择
“简单”用例如下所示:
List<MyObj> matching = new ArrayList<>();
for (MyObj o : list) {
if (null != o.getName() || null != o.getId()) {
matching.add(o);
}
}
举个例子:
Lists.filter(listMyObj, new Predicate<MyObj>() {
public boolean test(MyObj o) {
return null != o.getName() || null != o.getId();
}
});
我认为使用
MyObj::getName
/getId
和一些函数
包装器可以更好地执行“isNull”测试 您需要重写MyObj
的equals
和hashcode
方法。。。你能简化你的问题吗?如果你已经遍历了这个列表,你就不会想到使用entity.getName().equals(searchString)
和entity.getId().equals(searchId)
?我不是在值(test123,testOne,456)上做等式检查,而是在字段name和name上做等式检查id@rickygrimes这不是我写的吗?检查字段,而不是使用list.contains()
。如果没有实现,我可以不执行吗?他想查找ID或名称,这样equals就不会真正解决问题problem@rickygrimes它显然没有得到实施<代码>你需要做这件事:)这不等于是。阅读Javadoc::它是对称的:对于任何非空引用值x和y,x.equals(y)应该返回true,当且仅当y.equals(x)返回true时。
interface Predicate<T> {
boolean test(@Nullable T value);
}
public class Lists {
static <T> List<T> filter(List<? extends T> list, Predicate<T> predicate) {
List<MyObj> matching = new ArrayList<>();
for (MyObj o : list) {
if (predicate.test(o)) {
matching.add(o);
}
}
return matching;
}
}
Lists.filter(listMyObj, new Predicate<MyObj>() {
public boolean test(MyObj o) {
return null != o.getName() || null != o.getId();
}
});
myList.stream()
.filter(o -> null != o.getName() || null != o.getId())
.collect(Collectors.toList())