基于Java中的多个属性在多个条件上过滤列表

时间:2014-06-30 02:07:42

标签: java guava

我正在使用Google guava 17.0。我的课程Employee只包含两个属性,id类型Integersalary类型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();

filtersMap<String, Object>。当此地图同时包含密钥idsalary时,apply()方法中的第一个条件将评估为true,因此,它应根据这两个属性进行过滤。但是,它仅根据其中一个过滤列表。

那么如何在这里对多个属性应用过滤?

1 个答案:

答案 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;