Java List排序,分組等操作

假定有一列實體類對像

    List<User> list = UserServer.getList();

去重,去除重複對象(每個屬性的值都一樣的),需要注意的是要先重寫對象User的equals和hashCode方法

    List<User> distinctList = list.stream().distinct().collect(Collectors.toList());

排序,按id升續排列,如果要降續則改成:(a, b) -> b.getId() - a.getId(); a和b都是變量名(可以按自己意願取名字),都是list中的對象的實例

    List<User> sortList = list.stream().sorted((a, b) -> a.getId() - b.getId()).collect(Collectors.toList());

過濾,按照自己的需求來篩選list中的數據,比如我篩選出不及格的(小於60分)的人,t爲實例

    List<User> filterList = list.stream().filter(t -> t.getScore() < 60).collect(Collectors.toList());

map, 提取對象中的某一元素,例子中我取的是每個人的name,注意list中類型對應,如果取的是id或者班級,就應該是integer類型

    List<String> mapList = list.stream().map(t -> t.getName()).collect(Collectors.toList());

統計,統計所有人分數的和, 主要我設置的分數屬性是double類型的,所以用mapToDouble,如果是int類型的,則需要用mapToInt

    double sum = list.stream().mapToDouble(t -> t.getScore()).sum();
    int count = list.stream().mapToInt(t -> t.getId()).sum();

分組, 按照字段中某個屬性將list分組

    Map<Integer, List<User>> map = list.stream().collect(Collectors.groupingBy(t -> t.getGrade()));
    System.out.println("按年級分組"+map);
    /*然後再對map處理,這樣就方便取出自己要的數據*/
    for(Map.Entry<Integer, List<User>> entry : map.entrySet()){
        System.out.println("key:"+entry.getKey());
        System.out.println("value:"+entry.getValue());
    }

多重分組,先按年級分組,再按班級分組

    Map<Integer/*年級id*/, Map<Integer/*班級id*/, List<User>>> groupMap = list.stream().collect(Collectors.groupingBy(t -> t.getGrade(), Collectors.groupingBy(t -> t.getClasses())));
    
    System.out.println("按照年級再按班級分組:"+groupMap);
    System.out.println("取出一年級一班的list:"+groupMap.get(1).get(1));

多重分組,一般多重分組後都是爲了統計,比如說統計每個年級,每個班的總分數

    Map<Integer/*年級id*/, Map<Integer/*班級id*/, Double>> sumMap = list.stream().collect(Collectors.groupingBy(t -> t.getGrade(), Collectors.groupingBy(t -> t.getClasses(), Collectors.summingDouble(t -> t.getScore()))));
    System.out.println(sumMap);
    System.out.println("取出一年級一班的總分:"+sumMap.get(1).get(1));

stream是鏈式的,這些功能是可以一起使用的,例如:計算每個年級每個班的及格人數

    Map<Integer/*年級*/, Map<Integer/*班級*/, Long/*人數*/>> integerMap = list.stream().filter(t -> t.getScore() >= 60).collect(Collectors.groupingBy(t -> t.getGrade(), Collectors.groupingBy(t -> t.getClasses(), Collectors.counting())));
    System.out.println("取出一年級一班及格人數:"+integerMap.get(1).get(1));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章