检查对象列表是否包含String

时间:2014-09-18 18:19:46

标签: java

我的下面的类包含字段名称和ID -

    public class MyObj {
        private String name;
        private String id;
        //getters and setters + toString implementation
    }

在我的main方法中,我正在创建一个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);
   }

当我遍历列表并打印内容时,我有了这个 -

    MyObj [name=test, id=123]
    MyObj [name=testOne, id=456]

我想检查我的List是否有字符串。例如,如果它包含名称或ID?当我使用contains方法时,它返回false。显然我做错了什么。如何检查对象列表是否有字符串?

2 个答案:

答案 0 :(得分:1)

你可能想要像Java8 Stream和过滤器这样的东西,但是如果我理解你的问题(以及答案和评论)你想让所有MyObj符合标准吗?

在这种情况下,equals不是这样做的。例如:

MyObj a = ...
a.setName("A");
a.equals("A"); // returns true
"A".equals(a); // returns false!

equals的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或   如果没有平等使用的信息,则始终返回false   对象的比较被修改。   对于任何非空引用值x,x.equals(null)应返回false。
  •   

在这种情况下,你有一个非对称的等号(即使javadocs说它应该而不是必须)。

您可以使用过滤器或更好的Java 8 Stream

在Java 8之前,for循环或者像Guava这样的外部库是可行的方法。

&#34;简单&#34;用例如下:

List<MyObj> matching = new ArrayList<>();
for (MyObj o : list) {
  if (null != o.getName() || null != o.getId()) {
    matching.add(o);
  }
}

这表示您定义了name(例如:不null),id

如果您需要更进一步,使用高级标准,您可以这样做:

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();
  }
});

但你应该使用番石榴,因为它做的相同,而且更好(我的例子或多或少是番石榴所做的)。

至于Java 8:

myList.stream()
      .filter(o -> null != o.getName() || null != o.getId())
      .collect(Collectors.toList())

我认为你可以使用MyObj::getName / getId和一些Function包装器做得更好,以便做到#34; isNull&#34;测试。

答案 1 :(得分:0)

您需要在MyObj中实现equals方法