筆者最近新加入了一個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引入函數式編程的概念允許我們在操作數據集合可以編寫出更加流暢,簡潔的代碼。此外,外部迭代變為內部迭代,以及函數式編程的數據不變性特點,讓我們在處理集合時可以寫出並發性更好的代碼。