Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查对象列表是否包含字符串_Java - Fatal编程技术网

Java 检查对象列表是否包含字符串

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<

我有下面的类,其中包含字段名称和id-

    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
在这种情况下,有一个非对称的equals(即使javadocs说它应该而不是必须是)

您可以使用filter,或者更好的Java8的
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())