2014-09-04 64 views
0

我有这个List<MyObject> list在包含多个对象属性的列表中搜索对象

MyObject看起来是这样的:

public class MyObject { 

    String typeOfObject; 

    Integer anInteger; 

    Integer value; 
} 

如何从list其中typeOfObject = "objectA"anInteger = 1对象(S)?

我的目标是设置valueMyObject许多变量。

我看着Predicate,但似乎我可以基于我的搜索条件只有一个属性?

+1

如果'Predicate'适用于一个属性,有关链接谓词如何?另外,你究竟试过了什么,'stream()。filter(...)'? – 2014-09-04 12:36:15

+0

通过清单并获得您需要的内容怎么样? – iberbeu 2014-09-04 12:38:38

+0

@tobias_k你有一个例子吗? – BnJ 2014-09-04 12:39:52

回答

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

因此,在特定的情况下,评估方法看起来是这样的:

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; 
    } 
1

您将不得不重写equals()hashcode()来完成指代this链接来完成该操作。

+0

如果你想避免在每次你想要获取元素时迭代你的列表,这应该是正确和干净的方法。 – MichaelS 2014-09-04 12:49:12

+0

@MichaelS true。 – 2014-09-04 13:14:04

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); 
    }; 
} 
相关问题