Java - 用户定义类列表上的搜索条件

时间:2015-01-31 05:12:40

标签: java pojo

我有一个SearchCriteria POJO类

public class SearchCriteria{

private int empId;
private String empName;
private String empAddress;
private String empDesignation,
:
: 
//getter + setters
}

我在其他类

中有一个returnAllEmployees方法
public List<Employees> returnAllEmployees (){
// makes a db call which has lot of joins and returns info for all the employees
}

现在我的问题是我必须根据传递的搜索条件过滤掉returnAllEmployees()的结果,即如果searchcriteria的empName字段填充为“ABC”,则过滤器列表应包含所有员工的详细信息作为ABC。

同样,如果搜索条件包含empName =“ABC”和empDesignation =“engineer”,它应该过滤掉包含名称为abc且指定为工程师的所有员工的列表

我知道使用if-else是可能的,但这会产生很多代码行

1 个答案:

答案 0 :(得分:1)

您最好的解决方案是使用Java 8流。他们是完美的:

List<Employee> listOfEngineersCalledFred = getAllEmployees().stream()
    .filter(emp -> emp.getName().equals("Fred"))
    .filter(emp -> emp.getDesignation().equals("Engineer"))
    .collect(Collectors.toList());

我个人认为有用且简洁的技术是添加返回谓词而不是使用getter的静态方法:

class Employee {
    public static Predicate<Employee> hasName(String name) {
        return emp -> emp.name.equals(name);
    }
}

例如,可以使用这些来查找所有未调用Fred的员工:

streamAllEmployees()
    .filter(Employee.hasName("Fred").negate())
    ...

这比用吸气剂暴露场地更整洁,更有意识。

您也可以考虑将getAllEmployees转换为streamAllEmployees

public Stream<Employee> streamAllEmployees() {
    return employeeList.stream();
}

然后,您告诉用户他们可以使用列表中的员工对象而不是列表本身来执行操作。

将它作为流返回的好处是,一旦你过滤它就可以轻松地对其进行计数,分组,排序,删除重复项,获得第一个等等。如果你正在过滤,你甚至可以将它简单地转换为使用多个线程大量的物品。

例如:

Map<String, Employee> employeesByDesignation = streamAllEmployees()
    .collect(Collectors.groupingBy(emp -> emp.getDesignation()));

它们非常强大,值得学习和使用。