java使用stream计算(最大值、最小值、均值等等)

本文详细介绍了Java 8 Stream API在集合操作中的应用,包括分组、求和、查找最大值、最小值、平均值,以及排序、去重和转换为Map等高级功能。通过实例展示了如何使用懒加载和惰性求值提高性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。stream不是数据结构,不会保存数据;惰性求值,流在中间处理过程中,只是对操作进行了记录,并不会立即执行,需要等到执行终止操作的时候才会进行实际的计算。
直接上代码:为了方便验证,有些中间加了条件,筛出部分数据进行操作

public static void main(String[] args) {
        List<Persion> list = new ArrayList<>();
        list.add(new Persion("AAAA", 'F', 10));
        list.add(new Persion("BBBB", 'F', 11));
        list.add(new Persion("CCCC", 'F', 12));
        list.add(new Persion("DDDD", 'F', 13));
        list.add(new Persion("EEEE", 'F', 14));
        list.add(new Persion("FFFF", 'M', 15));
        list.add(new Persion("GGGG", 'M', 16));
        list.add(new Persion("HHHH", 'M', 17));
        list.add(new Persion("IIII", 'M', 18));
        list.add(new Persion("GGGG", 'M', 19));
        list.add(new Persion("KKKK", 'M', 20));

        //按某个字段进行分组
        Map<String, List<Persion>> listMap = list.stream().collect(Collectors.groupingBy(Persion::getName));
        Set<Map.Entry<String, List<Persion>>> entrySet = listMap.entrySet();
        for (Map.Entry<String, List<Persion>> stringListEntry : entrySet) {
            System.out.println(stringListEntry.getKey());
            System.out.println(stringListEntry.getValue());
        }

        //某个字段求和
        int sum = list.stream().mapToInt(l -> l.getAget()).sum();
        System.out.println(sum);
        Integer sum2 = list.stream().map(l -> l.getAget()).reduce(Integer::sum).orElse(0);
        System.out.println(sum2);

        //最大值
        int max = list.stream().mapToInt(l -> l.getAget()).max().getAsInt();
        System.out.println(max);

        //最小值
        int min = list.stream().mapToInt(l->l.getAget()).min().getAsInt();
        System.out.println(min);

        //均值
        double avg = list.stream().mapToDouble(l -> l.getAget()).average().getAsDouble();
        System.out.println(avg);

        //逆序
        List<Persion> sorts = list.stream().sorted(Comparator.comparing(Persion::getAget).reversed()).collect(Collectors.toList());
        sorts.forEach(System.out::println);
        List<Persion> sorts2 = list.stream().sorted((a, b) -> b.getAget().compareTo(a.getAget())).collect(Collectors.toList());
        sorts2.forEach(System.out::println);

        //去重
        List<String> distinct = list.stream().map(l->l.getName()).distinct().collect(Collectors.toList());
        System.out.println(distinct.size());

        //list转为map,toMap 如果集合对象有重复的key,会报错Duplicate key,可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2
        Map<String, Persion> listToMap = list.stream().collect(Collectors.toMap(Persion::getName, a -> a, (k1, k2) -> k1));
        Set<Map.Entry<String, Persion>> entries = listToMap.entrySet();
        for (Map.Entry<String, Persion> entry : entries) {
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        }


    }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值