Я только что попал в Google Guava и кажется мощным инструментом, и я вижу, как вы можете использовать Predicates и фильтровать по определенному свойству. Как вы можете также предикатов цепи в FluentIterable
. Мой вопрос - это лучший способ фильтрации для одного свойства.Google Guava - фильтр нескольких входов на одном объекте
Например, если у меня есть коллекция автомобилей. Как фильтровать Cars.getPaintColor(), чтобы дать мне автомобили, которые находятся в черном, красном и желтом? Создание 3 отдельных предикатов и использование FluentIterable кажется неуклюжим. Особенно в моем использовании, я мог бы хотеть, возможно, 10+ фильтров в одном и том же свойстве, и я бы не хотел создавать 10 Predicates.
Спасибо!
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();
Поскольку я использую список, я использовал copyOf
вместо of
при создании ImmutableSet.
Я не уверен, что добавить второй параметр сочинения. Я предполагаю, что это что-то вроде этого ... в классе CarObj.
static Predicate<CarObj> byColor= new Predicate<CarObj>() {
public boolean apply(CarObj input) {
// What do I put here?
}
};
Вы хотите отфильтровать одно значение свойства за раз (но с разными возможными значениями) или вы хотите разбить все ваши Автомобили на основе значения свойства? Вам либо нужен параметризованный «Predicate», либо просто извлечение «Function» (как упоминалось в ColinD) и 'Multimaps.index()'. –
@FrankPavageau Я хочу фильтровать одно значение свойства с разностными возможными значениями, но я также хочу фильтровать другие свойства, которые имеют разные возможные значения. – Alan