使用许多对象的属性搜索List中的对象

时间:2014-09-04 12:33:37

标签: java list predicates

我有List<MyObject> list

MyObject看起来像这样:

public class MyObject {

    String typeOfObject;

    Integer anInteger;

    Integer value;
}

如何从list typeOfObject = "objectA"anInteger = 1获取对象?

我的目标是使用value的{​​{1}}设置多个变量。

我看了MyObject,但似乎我的搜索条件只能基于一个属性?

3 个答案:

答案 0 :(得分:1)

您必须覆盖equals()hashcode()才能完成引用this链接以实现此目的。

答案 1 :(得分:1)

谓词可以完全按照您的意愿执行,并且可以根据您的需要处理任意数量的属性。您只需要使用您要测试的任何条件来实现evaluate()方法。

public class MyPredicate implements Predicate {
    private String testId;  
    private String otherId;

    public MyPredicate(String testId,String otherId) {
        this.testId = testId;
        this.otherId = otherId;
    }

    public boolean evaluate( Object obj ) {
        boolean match = false;
        if( obj instanceof MyObject ) {
            if( testId.equalsIgnoreCase( ((MyObject)obj).getId())
            && otherId.equalsIgnoreCase( ((MyObject)obj).getOtherId()) ) {
                match = true;
            }
        }
        return match;
    }
}

因此,在您的特定情况下,evaluate方法看起来像:

    public boolean evaluate( Object obj ) {
        boolean match = false;
        if( obj instanceof MyObject ) {
            if( "objectA".equals( ((MyObject)obj).typeOfObject ) 
            && 1 == ((MyObject)obj).anInteger ) {
                match = true;
            }
        }
        return match;
    }

答案 2 :(得分:1)

如果您使用的是Java 8,则可以使用filter来获取符合条件的元素,例如使用lambda表达式。您还可以实施自定义Predicate并在filter

中使用该自定义List<MyObject> objects = Arrays.asList( new MyObject("foo", 1, 42), new MyObject("foo", 3, 23), new MyObject("bar", 3, 42), new MyObject("foo", 4, 42)); List<MyObject> filtered = objects.stream() .filter(o -> o.typeOfObject.equals("foo") && o.value == 42) .collect(Collectors.toList()); System.out.println(filtered);
[(foo,1,42), (foo,4,42)]

输出为class MyObject { String typeOfObject; Integer anInteger; Integer value; public MyObject(String type, int i, int v) { this.typeOfObject = type; this.anInteger = i; this.value = v; } public String toString() { return String.format("(%s,%d,%d)", typeOfObject, anInteger, value); }; } ,使用此测试类:

{{1}}