zoukankan      html  css  js  c++  java
  • 流式编程的的几个实例

    笔者最近新加入了一个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引入函数式编程的概念允许我们在操作数据集合可以编写出更加流畅,简洁的代码。此外,外部迭代变为内部迭代,以及函数式编程的数据不变性特点,让我们在处理集合时可以写出并发性更好的代码。

  • 相关阅读:
    windows 按时自动化任务
    Linux libusb 安装及简单使用
    Linux 交换eth0和eth1
    I.MX6 GPS JNI HAL register init hacking
    I.MX6 Android mmm convenient to use
    I.MX6 GPS Android HAL Framework 调试
    Android GPS GPSBasics project hacking
    Python windows serial
    【JAVA】别特注意,POI中getLastRowNum() 和getLastCellNum()的区别
    freemarker跳出循环
  • 原文地址:https://www.cnblogs.com/jun-ma/p/4838260.html
Copyright © 2011-2022 走看看