国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

JAVA 8 StreamAPI 和 lambda表達式 總結(四)--stream的一些聚合操作

2019-11-06 08:02:50
字體:
來源:轉載
供稿:網友

在sql里,一些聚合操作max,count,或者只是進行一些分組,這些我們都很熟悉,在Stream API中,我們也可以做一些聚合操作.

我們定義一個類Group,里面有班級號,分數和學生的名字

package JDK.StreamAndLambda.groupToMap;/** * Created by panqian on 2017/2/28. */public class Group { String classes; String num; String name; public Group() { } public Group(String classes, String num, String name) { this.classes = classes; this.num = num; this.name = name; } public String getClasses() { return classes; } public void setClasses(String classes) { this.classes = classes; } public String getNum() { return num; } public void setNum(String num) { this.num = num; } public String getName() { return name; } public void setName(String name) { this.name = name; }}

然后創建一個ArrayList集合,分別添加四個學生,他們可能是同班同學。

ArrayList<Group> groups = new ArrayList<>();groups.add(new Group("1321813", "88", "panqian01"));groups.add(new Group("1321813", "100", "panqian02"));groups.add(new Group("1321814", "99", "panqian03"));groups.add(new Group("1321815", "70", "panqian04"));//所有人按班級分組Map<String, List<Group>> collect = groups.stream().collect(Collectors.groupingBy(Group::getClasses));Set<String> strings = collect.keySet();for (String s : strings) { System.out.PRintln(s + ":"); collect.get(s).forEach(x -> System.out.println(x.getName()));}

程序執行后,我們可以看到如下結果。它往collect方法里面傳了一個groupingBy(班級)靜態方法,跟sql 的 group by 很像,得到了是一個map結果,我們可以知道每個班里面有哪些人:

1321813:panqian01panqian021321814:panqian031321815:panqian04

如果我們想把學生的名字用”,”連接,程序可以稍作修改,groupingBy方法的第二個參數可以對每個結果進行map處理。

//所有人按班級分組(名字用,連接) Map<String, String> collect4 = groups.stream().collect(Collectors.groupingBy(Group::getClasses, Collectors.mapping(Group::getName, Collectors.joining(",")))); Set<String> strings4 = collect4.keySet(); for (String s : strings4) { System.out.println(s + ":"); System.out.println(collect4.get(s)); }

得出結果如下:

1321813:panqian01,panqian021321814:panqian031321815:panqian04

第三個需求是我們以90分為界限,分別找出90以上的人和90分以下的人,partitioningBy靜態方法返回的是帶布爾值的Collector,可以對元素處理之后返回的true或false為依據進行分組。

//按成績90分為界限 進行分組Map<Boolean, List<Group>> collect1 = groups.stream().collect(Collectors.partitioningBy(x -> Integer.valueOf(x.getNum()) > 90));Set<Boolean> strings1 = collect1.keySet();for (Boolean s : strings1) { System.out.println(s + ":"); collect1.get(s).forEach(x -> System.out.println(x.getName()));}//90分以下的人false:panqian01panqian04//90分以上的人true:panqian02panqian03

第四個需求,計算每個班的班級人數,先用groupingBy靜態方法進行班級分組,然后第二個參數傳入counting靜態方法進行聚合操作,從而對每個組計算總人數

//計算每個班的班級人數Map<String, Long> collect2 = groups.stream().collect(Collectors.groupingBy(Group::getClasses, Collectors.counting()));Set<String> strings2 = collect2.keySet();for (String s : strings2) { System.out.println(s + ":"); System.out.println(collect2.get(s));}1321813:21321814:11321815:1

最后一個需求,計算每個班的最高分,在groupingBy的第二個參數,我們可以傳入maxBy方法,求最大值,在maxBy方法里,需要我們傳入自定義的Comparator比較器,從而對分數進行排序,最后得出每個班得分最高的人

//計算每個班的最高分Map<String, Optional<Group>> collect3 = groups.stream().collect(Collectors.groupingBy(Group::getClasses, Collectors.maxBy(new Comparator<Group>() { @Override public int compare(Group o1, Group o2) { if (Integer.valueOf(o1.getNum()) > Integer.valueOf(o2.getNum())) return 1; return -1; }})));Set<String> strings3 = collect3.keySet();for (String s : strings3) { System.out.println(s + ":"); Optional<Group> group = collect3.get(s); group.ifPresent(x -> System.out.println(x.getName()));}1321813:panqian021321814:panqian031321815:panqian04
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 中江县| 齐齐哈尔市| 鲁山县| 龙门县| 班玛县| 徐汇区| 施甸县| 临朐县| 乌苏市| 万全县| 鸡西市| 祁东县| 霸州市| 呼玛县| 德化县| 灵石县| 通山县| 浏阳市| 罗平县| 南丰县| 农安县| 滁州市| 托克逊县| 延边| 资阳市| 新宾| 调兵山市| 渑池县| 雅江县| 永寿县| 黔东| 农安县| 高清| 施秉县| 富裕县| 叶城县| 昔阳县| 双城市| 涿鹿县| 渭源县| 榆中县|