2011-05-25 187 views
1

下面是對象結構 - A謂詞鏈接問題

  • 類有類的集合B
  • B具有一對一的映射與類C
  • 我有一個謂詞在C定義P

要求:返回的列表B其中至少有C的謂詞P返回true的元素之一。

我目前的解決方案有一個for循環。我想知道是否可以在不使用for循環的情況下完成。

+0

實現自定義比較? – dhblah 2011-05-25 21:35:29

+5

你能舉一個你當前'for'循環解決方案的例子嗎?我不知道我跟着你。 – ColinD 2011-05-25 21:49:04

回答

1

如果我正確地理解了這個......你不能只是創建一個謂詞B來調用謂詞C嗎?

即B中......

new Predicate<B>() { 
    @Override 
    public boolean apply(B record) { 
    return new PredicateOverC().apply(record.getC()) 
    } 
} 

,然後在你可以只使用Collections2.filter在B的收集和這個新謂詞?

4

爲什麼定義Predicate的位置很重要?你的意思是它定義爲on C?除了我使用Iterables.filter()和構成謂語,而不是使用Collections2的,但想法是一樣

// You already have Predicate<C> defined somewhere 
Predicate<C> csPredicate = new Predicate<C>() { 
    public boolean apply(C c) { 
     return someComputationOn(c); 
    } 
}; 

Iterables.filter(A.getIterableOfB(), 
    Predicates.compose(
     csPredicate, 
     new Function<B, C>() { 
      @Override 
      public C apply(B b) { 
       return b.getC(); 
      } 
})); 

我的答案是非常相似的sMoZely(+1)。我也可能會在這個問題上丟失一些東西...

+0

這也是一個很好的解決方案...我不知道寫作功能。 – sMoZely 2011-05-25 23:46:13

+1

需要實現'Predicted ' – Ray 2011-05-26 11:39:19

+1

@Ray - 是的,你說得很對 - 我離開它,因爲OP似乎已經有了,所以我把它留作佔位符 - 我已經更新了答案。 – alpian 2011-05-26 11:53:32