亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java中如何用Stream分組并求各組數(shù)量

 更新時間:2023年07月14日 11:10:03   作者:jeromewontstop  
這篇文章主要給大家介紹了關于Java中如何用Stream分組并求各組數(shù)量的相關資料,文中通過實例代碼,對大家學習或者Java具有一定的參考借鑒價值,需要的朋友可以參考下

比如給了我一個班級的所有人的姓氏和姓名對象集合,根據這個集合求出各姓氏有多少人。直接上代碼。

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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論