1. 程式人生 > >使用java8的StreamAPI對集合計算進行程式碼重構

使用java8的StreamAPI對集合計算進行程式碼重構

方法: 查詢出所有部門成員中年齡大於30的員工姓名

部門物件:

 

員工物件:

 

模擬資料:

 

    private static List<Dept> list=new ArrayList<Dept>();
    private static List<Employee> listEmpl01=new ArrayList<Employee>();
    private static List<Employee> listEmpl02=new ArrayList<Employee>();
    static{//初始化資料
        Employee employee1=new Employee(1,"張三",25,1);
        Employee employee2=new Employee(1,"李四",32,1);
        Employee employee3=new Employee(1,"王五",25,1);
        Employee employee4=new Employee(1,"趙六",34,2);
        Employee employee5=new Employee(1,"周七",43,2);
        Employee employee6=new Employee(1,"小明",26,2);
        Employee employee7=new Employee(1,"大熊",22,2);
        listEmpl01.add(employee1);
        listEmpl01.add(employee2);
        listEmpl01.add(employee3);
        listEmpl02.add(employee4);
        listEmpl02.add(employee5);
        listEmpl02.add(employee6);
        listEmpl02.add(employee7);
        Dept dept01=new Dept(1,"研發部",listEmpl01);
        Dept dept02=new Dept(2,"人力資源部",listEmpl02);
    }

 

  ok了,如果不使用stream,那麼就要使用雙重for迴圈來做了:

    public static void main(String[] args) {
        List<String> result = getNameByAge(list);
        System.out.println(result);
    }
    //原始查詢方法
    public static List<String> getNameByAge(List<Dept> list){
        List<String> result=new ArrayList<String>();
        for (Dept dept:list) {
            List<Employee> employees = dept.getEmployees();
            for (Employee employee:employees){
                if(employee.getAge()>30){
                    result.add(employee.getName());
                }
            }
        }
        return result;
    }

  這也是之前非常普片通用的做法,這種做法其實非常繁瑣,可以先去掉for迴圈:

    //for迴圈重構
    public static List<String> getNameByAgeOne(List<Dept> list){
        List<String> result=new ArrayList<String>();
        list.forEach(dept->{
            dept.getEmployees().forEach(employee->{
                if(employee.getAge()>30){
                    result.add(employee.getName());
                }
            });
        });
        return result;
    }

  然後接著重構,上面這種明顯和沒重構之前區別不大:

    //stream重構
    public static List<String> getNameByAgeTwo(List<Dept> list){
        List<String> result=new ArrayList<String>();
        list.stream().forEach(dept->{
            dept.getEmployees().stream().filter(employee -> employee.getAge()>30)//使用流過濾
                    .map(employee->employee.getName()) //挑選出name
                    .forEach(name->result.add(name));
        });
        return result;
    }

  這裡就使用了stream流,先將部門集合轉換為流,再進行迭代,取出每一個員工集合,再使用流進行過濾,取name等操作,

但是流中是可以合併流的,即我們完全沒必要使用foreach中將每一個員工集合轉換成流了,直接使用合併流,而且流可以轉換成集合

,這也就意味著可以直接返回流轉成的集合了:

    //stream再重構
    public static List<String> getNameByAgeFinal(List<Dept> list){
        return list.stream().flatMap(dept -> dept.getEmployees().stream())
                .filter(employee ->employee.getAge()>30 )
                .map(employee -> employee.getName())
                .collect(Collectors.toList());
    }
}

  直接將流collect(Collectors.toList());返回非常方便,使用flatMap將每個部門的員工集合流合併得到所有員工的流,就可以去掉for迴圈了,之後再進行操作,這樣重構就完美了!!!

最後結果:

效果都是一樣的,但是程式碼看著高大上多了!stream確實非常強大方便!!