以下是对象结构 -
A
有一个班级B
B
与班级C
P
C
要求:返回B
的列表,其中至少包含C
谓词P
返回true
的元素之一。
我目前的解决方案有一个for循环。我想知道是否可以在不使用for循环的情况下完成。
答案 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和这个新谓词的集合?