Collections 谷歌番石榴-过滤单个属性上的多个输入
我刚刚进入Google Guava,它似乎是一个强大的工具,我看到了如何使用谓词并根据特定属性进行过滤。如何在Collections 谷歌番石榴-过滤单个属性上的多个输入,collections,filter,guava,android-guava,Collections,Filter,Guava,Android Guava,我刚刚进入Google Guava,它似乎是一个强大的工具,我看到了如何使用谓词并根据特定属性进行过滤。如何在fluenterable中链接谓词我的问题是过滤单个属性的最佳方法是什么 例如,如果我有一系列汽车。如何过滤汽车。getPaintColor()提供黑色、红色和黄色的汽车?创建3个独立的谓词并使用Fluentitable似乎很笨拙。特别是在我的使用中,我可能希望在同一个属性上有10个以上的过滤器,而我不想创建10个谓词 谢谢你 List<String> col
fluenterable
中链接谓词我的问题是过滤单个属性的最佳方法是什么
例如,如果我有一系列汽车。如何过滤汽车。getPaintColor()提供黑色、红色和黄色的汽车?创建3个独立的谓词并使用Fluentitable似乎很笨拙。特别是在我的使用中,我可能希望在同一个属性上有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();
因此,要检查绘制颜色是黑色、红色还是黄色,您需要创建一个
谓词
,用于检查集合是否包含该颜色:
Predicate<PaintColor> p = Predicates.in(ImmutableSet.of(
PaintColor.RED, PaintColor.BLACK, PaintColor.YELLOW));
正如我在评论中所说的,您可以根据需要调整它以适应您的实际类型。例如,将其改为
函数。因此,要检查绘制颜色是黑色、红色还是黄色,您需要创建一个谓词来检查集合是否包含该颜色:
Predicate<PaintColor> p = Predicates.in(ImmutableSet.of(
PaintColor.RED, PaintColor.BLACK, PaintColor.YELLOW));
正如我在评论中所说的,您可以根据需要调整它以适应您的实际类型。例如,将其改为函数
。用谓词组合提取函数
的替代方法。根据ColinD的建议,在()中
编写参数化谓词
:
公共类CarPaintColorPredicate实现谓词{
私人最终油漆颜色;
公共CarPaintColorPredicate(PaintColor PaintColor){
this.paintColor=paintColor;
}
@凌驾
公共布尔应用(@Nullable Car input){
返回输入!=null&&input.getPaintColor()==paintColor;
}
}
然后您可以直接使用:
fluentitable.from(汽车)
.filter(新的CarPaintColorPredicate(PaintColor.RED))
.toList();
或组合多种颜色:
fluentitable.from(汽车)
.filter(谓词)或(
新的CarPaintColorPredicate(PaintColor.RED),
新的CarPaintColorPredicate(PaintColor.BLACK)))
.toList();
或者甚至与其他类型的谓词组合:
fluentitable.from(汽车)
.filter(新的CarPaintColorPredicate(PaintColor.RED))
.过滤器(新卡马克(“法拉利”))
.toList();
完整地说,具有功能的版本如下:
公共枚举函数实现函数{
实例;
@凌驾
公共油漆颜色应用(@Nullable Car input){
返回input==null?null:input.getPaintColor();
}
}
函数
只返回属性值,然后通过谓词
组合将属性值与接受值的集合(希望是集合
)进行比较:
fluentitable.from(汽车)
.filter(谓词.compose(
谓词.in(set.immutableEnumSet(PaintColor.RED,PaintColor.BLACK)),
CarPaintColorFunction.INSTANCE)
.toList();
所有这些都在Guava Wiki的页面中进行了真正的解释。使用谓词组合提取函数的替代方法。按照ColinD的建议,在()中编写参数化谓词
:
公共类CarPaintColorPredicate实现谓词{
私人最终油漆颜色;
公共CarPaintColorPredicate(PaintColor PaintColor){
this.paintColor=paintColor;
}
@凌驾
公共布尔应用(@Nullable Car input){
返回输入!=null&&input.getPaintColor()==paintColor;
}
}
然后您可以直接使用:
fluentitable.from(汽车)
.filter(新的CarPaintColorPredicate(PaintColor.RED))
.toList();
或组合多种颜色:
fluentitable.from(汽车)
.filter(谓词)或(
新的CarPaintColorPredicate(PaintColor.RED),
新的CarPaintColorPredicate(PaintColor.BLACK)))
.toList();
或者甚至与其他类型的谓词组合:
fluentitable.from(汽车)
.filter(新的CarPaintColorPredicate(PaintColor.RED))
.过滤器(新卡马克(“法拉利”))
.toList();
完整地说,具有功能的版本如下:
公共枚举函数实现函数{
实例;
@凌驾
公共油漆颜色应用(@Nullable Car input){
返回input==null?null:input.getPaintColor();
}
}
函数
只返回属性值,然后通过谓词
组合将属性值与接受值的集合(希望是集合
)进行比较:
fluentitable.from(汽车)
.filter(谓词.compose(
谓词.in(set.immutableEnumSet(PaintColor.RED,PaintColor.BLACK)),
CarPaintColorFunction.INSTANCE)
.toList();
所有这些都在Guava Wiki的页面中进行了详细说明。您是希望一次筛选一个属性值(但使用不同的可能值),还是希望根据属性值对所有汽车进行分区?您要么需要一个参数化的谓词
,要么只需要提取函数
(如ColinD所述)和多重映射。index()
@FrankPavageau我想用不同的可能值筛选属性的一个值,但我还想筛选具有不同可能值的其他属性。您是希望一次筛选该属性的一个值(但可能值不同),还是希望根据该属性的值对所有汽车进行分区?您要么需要一个参数化的谓词
,要么只需要提取Predicate<Car> p2 = Predicates.compose(p, Car.GET_PAINT_COLOR_FUNCTION);
public static final Function<Car, PaintColor> GET_PAINT_COLOR_FUNCTION =
new Function<Car, PaintColor>() {
@Override public PaintColor apply(Car car) {
return car.getPaintColor();
}
});