【发布时间】:2015-01-08 23:16:49
【问题描述】:
我刚进入 Google Guava,它似乎是一个强大的工具,我了解了如何使用谓词并按特定属性进行过滤。如何在FluentIterable 中链接谓词我的问题是过滤单个属性的最佳方法是什么。
例如,如果我有一个 Cars 集合。如何过滤 Cars.getPaintColor() 以提供黑色、红色和黄色的汽车?创建 3 个单独的谓词并使用 FluentIterable 似乎很笨拙。特别是在我的使用中,我可能希望在同一个属性上使用 10 多个过滤器,并且我不想创建 10 个谓词。
谢谢!
List<String> colorList = (List<String>)filterCriteria.get("Color");
List<String> makeList = (List<String>)filterCriteria.get("Make");
List<String> rimSizeList = (List<String>)filterCriteria.get("RimSize");
Predicate<String> predColor = Predicates.in(ImmutableSet.copyOf(colorList));
Predicate<CarObj> predDirection2 = Predicates.compose(predColor ,[????] );
Predicate<String> predMakeList = Predicates.in(ImmutableSet.copyOf(makeList));
Predicate<CarObj> predMakeList2 = Predicates.compose(predMakeList, [????] );
Predicate<String> predRimSize = Predicates.in(ImmutableSet.copyOf(rimSizeList));
Predicate<CarObj> predRimSize2 = Predicates.compose(predRimSize, [????] );
Collection<CarObj> filtered = FluentIterable.from(mAllCars)
.filter(predDirection2)
.filter(predMakeList2)
.filter(predRimSize2)
.toList();
由于我使用的是 List,所以我在创建 ImmutableSet 时使用了 copyOf 而不是 of。
我不确定在 compose 的第二个参数中放什么。我猜它是这样的……在 CarObj 类中。
static Predicate<CarObj> byColor= new Predicate<CarObj>() {
public boolean apply(CarObj input) {
// What do I put here?
}
};
【问题讨论】:
-
您想一次过滤属性的一个值(但使用不同的可能值),还是想根据属性值对所有汽车进行分区?您要么需要参数化的
Predicate,要么只需要提取Function(如 ColinD 所述)和Multimaps.index()。 -
@FrankPavageau 我想过滤具有不同可能值的属性的一个值,但我也想过滤具有不同可能值的其他属性。
标签: collections filter guava android-guava