谓词链接问题

时间:2011-05-25 21:31:41

标签: java guava

以下是对象结构 -

  • 班级A有一个班级B
  • 的集合
  • 班级B与班级C
  • 有一对一的映射
  • 我在P
  • 中定义了谓词C

要求:返回B的列表,其中至少包含C谓词P返回true的元素之一。

我目前的解决方案有一个for循环。我想知道是否可以在不使用for循环的情况下完成。

2 个答案:

答案 0 :(得分:4)

为什么定义谓词的位置很重要?你的意思是它定义 C?

// 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)非常相似,除了我使用Iterables.filter()并编写Predicates而不是使用Collections2,但想法是一样的。我可能也会在问题中遗漏一些内容......

答案 1 :(得分:1)

如果我理解正确的话......难道你不能只为B调用Predicate来创建一个谓词吗?

即。在B ...

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

然后在A中你可以使用Collections2.filter而不是B和这个新谓词的集合?