Java中如何用Stream分組并求各組數(shù)量
比如給了我一個班級的所有人的姓氏和姓名對象集合,根據這個集合求出各姓氏有多少人。直接上代碼。
User的實體類對象為
@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);
輸出的結果為:
即姓張的有3個,姓李的有兩個。
詳解: 將該集合的stream流用Collectors對象轉成Map,用User對象的firstName作為Key,默認鍵值為1,在處理鍵沖突的函數(shù)中,將上一次的值與默認值1相加。比如處理第一個姓張的人的時候,默認值為1,處理第二個也是姓張的人的時候默認值也是1,將1和1相加得2,(即有兩個姓張的人了),處理第三個姓張的人的時候,將上次的結果2與第三個姓張返回的默認值1相加,得3,以此類推...得到處理結果。
附:Java中用Stream分組并求各組數(shù)量
一:多字段分組統(tǒng)計
方法一
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<>(); //先根據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());
獲取此類格式數(shù)據 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); }
總結
到此這篇關于Java中如何用Stream分組并求各組數(shù)量的文章就介紹到這了,更多相關Java用Stream分組內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解析spring-boot-starter-parent簡介
本文通過代碼的形式給大家介紹了spring-boot-starter-parent的基礎知識,需要的朋友可以參考下2018-09-09java?數(shù)組越界判斷和獲取數(shù)組長度的實現(xiàn)方式
這篇文章主要介紹了java?數(shù)組越界判斷和獲取數(shù)組長度的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12mybatis如何使用Criteria的and和or進行聯(lián)合查詢
這篇文章主要介紹了mybatis如何使用Criteria的and和or進行聯(lián)合查詢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12