Java中如何用Stream分組并求各組數(shù)量
比如給了我一個(gè)班級(jí)的所有人的姓氏和姓名對(duì)象集合,根據(jù)這個(gè)集合求出各姓氏有多少人。直接上代碼。
User的實(shí)體類(lèi)對(duì)象為
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String firstName; // 姓氏
private String name; // 姓名
}List<User> userList = new ArrayList<>();
userList.add(new User("張","張三"));
userList.add(new User("張","張四"));
userList.add(new User("張","張五"));
userList.add(new User("李","李一"));
userList.add(new User("李","李二"));
Map<String, Integer> groupCount = userList.stream()
.collect(Collectors.toMap(User::getFirstName, el -> 1, Integer::sum));
System.out.println(groupCount);輸出的結(jié)果為:

即姓張的有3個(gè),姓李的有兩個(gè)。
詳解: 將該集合的stream流用Collectors對(duì)象轉(zhuǎn)成Map,用User對(duì)象的firstName作為Key,默認(rèn)鍵值為1,在處理鍵沖突的函數(shù)中,將上一次的值與默認(rèn)值1相加。比如處理第一個(gè)姓張的人的時(shí)候,默認(rèn)值為1,處理第二個(gè)也是姓張的人的時(shí)候默認(rèn)值也是1,將1和1相加得2,(即有兩個(gè)姓張的人了),處理第三個(gè)姓張的人的時(shí)候,將上次的結(jié)果2與第三個(gè)姓張返回的默認(rèn)值1相加,得3,以此類(lèi)推...得到處理結(jié)果。
附:Java中用Stream分組并求各組數(shù)量
一:多字段分組統(tǒng)計(jì)
方法一
public static void main(String[] args) {
List<Test> list = new ArrayList<>();
for(int i = 0; i< 5; i++){
Test test = new Test();
//主鍵id
test.setId(Long.valueOf(i));
//金額
test.setMoney(new BigDecimal(i));
//數(shù)量
test.setCount(new BigDecimal(i));
list.add(test);
}
for(int i = 0; i< 2; i++){
Test test = new Test();
//主鍵id
test.setId(Long.valueOf(i));
//金額
test.setMoney(new BigDecimal(i));
//數(shù)量
test.setCount(new BigDecimal(i));
list.add(test);
}
List<Test> resultList = new ArrayList<>();
//先根據(jù)id分組
Map<Long,List<Test>> map = list.stream().collect(Collectors.groupingBy(m->m.getId()));
//分組后求 總金額,總數(shù)量
map.keySet().stream().forEach(key->{
Test info = new Test();
List<Test> listInfo = map.get(key);
//總金額
BigDecimal sumMoney = listInfo.stream().map(Test::getMoney).reduce(BigDecimal.ZERO,BigDecimal::add);
//總數(shù)量
BigDecimal sumCount = listInfo.stream().map(Test::getCount).reduce(BigDecimal.ZERO,BigDecimal::add);
info.setId(key);
info.setMoney(sumMoney);
info.setCount(sumCount);
resultList.add(info);
});
System.out.println(resultList);
}方法二
List<Student> collect = stus.stream().collect(Collectors.toMap(k ->k.getId()+k.getBj(), e -> e, (o1, o2) -> {
o1.setK0qmkcje((null==o1.getK0qmkcje()?BigDecimal.ZERO:o1.getK0qmkcje()).add((null==o2.getK0qmkcje()?BigDecimal.ZERO:o2.getK0qmkcje())).setScale(0,BigDecimal.ROUND_HALF_UP));
return o1;
})).values().stream().collect(Collectors.toList());獲取此類(lèi)格式數(shù)據(jù) Map<String, BigDecimal>
public static void main(String[] args) {
Map<String, BigDecimal> ageGroup = list.stream().collect(Collectors.groupingBy(Student::getName
, Collectors.collectingAndThen(Collectors.toList()
, x -> x.stream().map(Student::getStature).reduce(BigDecimal.ZERO, BigDecimal::add))));
}public static void main(String[] args) {
Map<String, BigDecimal> ageGroup = list.stream().collect(Collectors.groupingBy(Student::getName
, MyCollector.summingDecimal(Student::getStature)));
System.out.println(ageGroup);
}總結(jié)
到此這篇關(guān)于Java中如何用Stream分組并求各組數(shù)量的文章就介紹到這了,更多相關(guān)Java用Stream分組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解析spring-boot-starter-parent簡(jiǎn)介
本文通過(guò)代碼的形式給大家介紹了spring-boot-starter-parent的基礎(chǔ)知識(shí),需要的朋友可以參考下2018-09-09
Java網(wǎng)絡(luò)編程實(shí)現(xiàn)多線(xiàn)程聊天
這篇文章主要為大家詳細(xì)介紹了Java網(wǎng)絡(luò)編程實(shí)現(xiàn)多線(xiàn)程聊天,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
java?數(shù)組越界判斷和獲取數(shù)組長(zhǎng)度的實(shí)現(xiàn)方式
這篇文章主要介紹了java?數(shù)組越界判斷和獲取數(shù)組長(zhǎng)度的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Java運(yùn)行時(shí)多態(tài)性的實(shí)現(xiàn)
Java運(yùn)行時(shí)多態(tài)性的實(shí)現(xiàn)...2006-12-12
地址到經(jīng)緯度坐標(biāo)轉(zhuǎn)化的JAVA代碼
這篇文章介紹了地址到經(jīng)緯度坐標(biāo)轉(zhuǎn)化的JAVA代碼,有需要的朋友可以參考一下2013-09-09
mybatis如何使用Criteria的and和or進(jìn)行聯(lián)合查詢(xún)
這篇文章主要介紹了mybatis如何使用Criteria的and和or進(jìn)行聯(lián)合查詢(xún),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Springboot的自動(dòng)配置是什么及注意事項(xiàng)
SpringBoot的自動(dòng)配置(Auto-configuration)是指框架根據(jù)項(xiàng)目的依賴(lài)和應(yīng)用程序的環(huán)境自動(dòng)配置Spring應(yīng)用上下文中的Bean和組件,目的是簡(jiǎn)化開(kāi)發(fā)者的配置工作,本文介紹Springboot的自動(dòng)配置是什么及注意事項(xiàng),感興趣的朋友一起看看吧2025-03-03

