假定有一列實體類對像
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));