Collections 谷歌番石榴-过滤单个属性上的多个输入

Collections 谷歌番石榴-过滤单个属性上的多个输入,collections,filter,guava,android-guava,Collections,Filter,Guava,Android Guava,我刚刚进入Google Guava,它似乎是一个强大的工具,我看到了如何使用谓词并根据特定属性进行过滤。如何在fluenterable中链接谓词我的问题是过滤单个属性的最佳方法是什么 例如,如果我有一系列汽车。如何过滤汽车。getPaintColor()提供黑色、红色和黄色的汽车?创建3个独立的谓词并使用Fluentitable似乎很笨拙。特别是在我的使用中,我可能希望在同一个属性上有10个以上的过滤器,而我不想创建10个谓词 谢谢你 List<String> col

我刚刚进入Google Guava,它似乎是一个强大的工具,我看到了如何使用谓词并根据特定属性进行过滤。如何在
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();
      }
    });