2014-09-04 94 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); 
    }; 
} 
相關問題