我正在使用Google guava 17.0。我的课程Employee
只包含两个属性,id
类型Integer
和salary
类型BigDecimal
。
我尝试根据以下两个属性进行过滤。
List<Employee>entireList=null; //This list is already populated somehow by a list of employee objects.
entireList = FluentIterable.from(entireList).filter(new Predicate<Employee>() {
@Override
public boolean apply(Employee employee) {
if(filters.containsKey("id")&&filters.get("id") instanceof Integer&&filters.containsKey("salary")&&filters.get("salary") instanceof BigDecimal)
{
return ((Integer)filters.get("id")).equals(employee.getId())&&((BigDecimal)filters.get("salary")).compareTo(employee.getSalary())>=0;
}
if(filters.containsKey("id")&&filters.get("id") instanceof Integer)
{
return ((Integer)filters.get("id")).equals(employee.getId());
}
if(filters.containsKey("salary")&&filters.get("salary") instanceof BigDecimal)
{
return ((BigDecimal)filters.get("salary")).compareTo(employee.getSalary())>=0;
}
return false;
}
}).toList();
filters
是Map<String, Object>
。当此地图同时包含密钥id
和salary
时,apply()
方法中的第一个条件将评估为true,因此,它应根据这两个属性进行过滤。但是,它仅根据其中一个过滤列表。
那么如何在这里对多个属性应用过滤?
答案 0 :(得分:2)
这非常完美混淆。所以它甚至可以在没有人注意的情况下工作。
我们来看看:
filters.containsKey("id")
没用,放弃它。
filters.get("id") instanceof Integer
如果有人放了其他东西,最好扔掉。所以也放弃它。
return ((Integer)filters.get("id")).equals(employee.getId())&&((BigDecimal)filters.get("salary")).compareTo(employee.getSalary())>=0;
你会对5或10个条件做什么?组合爆炸?
那么这个呢?
Integer id = (Integer) filters.get("id");
if (id != null && !id.equals(employee.getId())) return false;
BigDecimal salary = (BigDecimal) filters.get("salary");
if (salary != null && ((salary.compareTo(employee.getSalary()) < 0)) return false;
return true;