笔者最近新加入了一个Java开发项目,在熟悉项目代码的过程中,让笔者感到惊讶的是,基于JDK 8的项目,代码中竟然没有是使用Java 8强大而方便的函数式编程理念。借着这个机会,笔者以项目中遇到的几处代码为例(类似代码)和大家重温一下流式编程的一些技巧。
samples
例子中代码中使用的Employee类是一个Java Bean,类包涵四个属性:name,id,address,enterTime(入职时间),每个属性提供set和get方法。
使用"流式理念"进行对象构建
源码:
public Employee getEmployee(String name,String address,Date date,Integer id){
Employee employee = new Employee();
employee.setAddress(address);
employee.setEnterTime(date);
employee.setId(id);
employee.setName(name);
return employee;
}
修改后:
将Employee中setXXX方法返回类型由void改为Employee
public Employee getEmployee1(String name,String address,Date date,Integer id){
return new Employee()
.setAddress(address)
.setName(name)
.setId(id)
.setEnterTime(time);
}
使用JDK8的Stream流处理集合
Java 8在对集合的处理引入了stream的概念,任何集合类都可以转换成stream,然后应用java 8提供的内置函数(比如filter,match,map等)来实现我们的业务逻辑。
根据id,查询list里面的employee
源码:
public Employee getEmployee(Integer employeeId){
for(Employee employee:employeeList){
if(employee.getId().equals(employeeId)){
return employee;
}
}
return null;
}
修改后:
public Employee getEmployee(final Integer employeeId){
return employeeList.stream()
.filter(employee -> employee.getId().equals(employeeId))
.findFirst()
.get();
}
查询list中是否包涵id=10的员工
源码:
public boolean isExist(Integer employeeId){
for(Employee employee:employeeList){
if(employee.getId().equals(employeeId)){
return true;
}
}
return false;
}
修改后:
public boolean isExist1(Integer employeeId){
return employeeList.stream().
anyMatch(employee -> employee.getId().equals(employeeId));
}
查询list中id>100的所有员工
源码:
public List<Employee> getEmployees(){
List<Employee> employees = new ArrayList<>();
for(Employee employee:employeeList){
if(employee.getId()>100){
employees.add(employee);
}
}
return employees;
}
修改后:
public List<Employee> getEmployees(){
return employeeList.stream()
.filter(employee -> employee.getId()>100)
.collect(Collectors.toList());
}
查询list中所有人的名字
源码:
public List getAllNames() {
List<String> names = new ArrayList<>();
for (Employee employee : employeeList) {
names.add(employee.getName());
}
return names;
}
修改后
public List<String> getAllNames() {
return employeeList.stream()
.map(employee -> employee.getName())
.collect(Collectors.toList());
}
Conclusion
其他集合的操作和文中给出的list实例相近,不做过多描述。JDK8引入函数式编程的概念允许我们在操作数据集合可以编写出更加流畅,简洁的代码。此外,外部迭代变为内部迭代,以及函数式编程的数据不变性特点,让我们在处理集合时可以写出并发性更好的代码。