Java8 新特性 stream操作List<T> 的 过滤、取值、排序、求和、分组

功能:Stream可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

核心概念理解

一个流的操作 = 创建流 + 中间操作 + 结果转换。

  1. 创建流:指从集合转换过滤,数值转换过滤、I/O转换、创建等等;
  2. 中间操作:指对流中的数据进行聚合,如filter\map\sorted\reduce、distinct等等;
  3. 结果转换:指将流进行输出,打印、转换成array、转换成collection等;

操作

    public static void main(String[] array) {
        List<User> userList = new ArrayList<>();
        // 添加数据
        User user = new User();
        user.setName("小明");
        user.setSex("男");
        user.setAge(18);
        user.setAgeBig(new BigDecimal(18));
        user.setUserDate(LocalDateTime.now().minusYears(18));
        User user1 = new User();
        user1.setName("小黄");
        user1.setSex("男");
        user1.setAge(19);
        user1.setAgeBig(new BigDecimal(19));
        user1.setUserDate(LocalDateTime.now().minusYears(19));
        User user2 = new User();
        user2.setName("小红");
        user2.setSex("女");
        user2.setAge(20);
        user2.setAgeBig(new BigDecimal(20));
        user2.setUserDate(LocalDateTime.now().minusYears(20));
        // 数据放入集合
        userList.add(user);
        userList.add(user1);
        userList.add(user2);

        /************************************** Java8 stream 基础操作 ************************************/
        // 过滤数据(找出所有男的)
        List<User> userManList = userList.stream().filter(u -> "男".equals(u.getSex())).collect(Collectors.toList());
        System.out.println("所有的男孩:" + JsonUtils.getGson().toJson(userManList));
        // 把所有人的名字取出来
        List<String> userNameList = userList.stream().map(User::getName).collect(Collectors.toList());
        System.out.println("所有人的名字:" + JsonUtils.getGson().toJson(userNameList));
        // 根据出生年月日排序(顺序)
        List<User> userSortedList = userList.stream().sorted(Comparator.comparing(User::getUserDate)).collect(Collectors.toList());
        System.out.println("根据出生年月日排序 (顺序):" + JsonUtils.getGson().toJson(userSortedList));
        // 根据出生年月日排序(倒序)
        List<User> userSortedDescList = userList.stream().sorted(Comparator.comparing(User::getUserDate).reversed()).collect(Collectors.toList());
        System.out.println("根据出生年月日排序(倒序):" + JsonUtils.getGson().toJson(userSortedDescList));
        // 把所有人年龄求和 sum():求和,average():平均,count():计数
        Integer userAgeSumList = userList.stream().mapToInt(User::getAge).sum();
        System.out.println("把所有人年龄求和:" + userAgeSumList);
        // 把所有人年龄求和 (BigDecimal 类型)
        BigDecimal userAgeBigSumList = userList.stream().map(User::getAgeBig).reduce(BigDecimal.ZERO, BigDecimal::add);;
        System.out.println("把所有人年龄求和 (BigDecimal 类型):" + userAgeBigSumList);
        // 按性别就行分组
        Map<String, List<User>> userSexGroupList = userList.stream().collect(Collectors.groupingBy(User::getSex));
        // 遍历Map
        for (Map.Entry<String, List<User>> userMap : userSexGroupList.entrySet()) {
            System.out.println("性别:" + userMap.getKey() + " = " + JsonUtils.getGson().toJson(userMap.getValue()));
        }
    }
}

 注:

JsonUtils.getGson().toJson() 方法只是用于把List对象转换成Json格式输出

结果 

1,所有的男孩:[{"name":"小明","sex":"男","age":18,"ageBig":18,"userDate":"2002-10-13 16:04:11"},{"name":"小黄","sex":"男","age":19,"ageBig":19,"userDate":"2001-10-13 16:04:11"}]

2,所有人的名字:["小明","小黄","小红"]

3,根据出生年月日排序 (顺序):[{"name":"小红","sex":"女","age":20,"ageBig":20,"userDate":"2000-10-13 16:04:11"},{"name":"小黄","sex":"男","age":19,"ageBig":19,"userDate":"2001-10-13 16:04:11"},{"name":"小明","sex":"男","age":18,"ageBig":18,"userDate":"2002-10-13 16:04:11"}]
4,根据出生年月日排序(倒序):[{"name":"小明","sex":"男","age":18,"ageBig":18,"userDate":"2002-10-13 16:04:11"},{"name":"小黄","sex":"男","age":19,"ageBig":19,"userDate":"2001-10-13 16:04:11"},{"name":"小红","sex":"女","age":20,"ageBig":20,"userDate":"2000-10-13 16:04:11"}]

5,把所有人年龄求和:57
6,把所有人年龄求和 (BigDecimal 类型):57

7,性别:女 = [{"name":"小红","sex":"女","age":20,"ageBig":20,"userDate":"2000-10-13 16:04:11"}]
8,性别:男 = [{"name":"小明","sex":"男","age":18,"ageBig":18,"userDate":"2002-10-13 16:04:11"},{"name":"小黄","sex":"男","age":19,"ageBig":19,"userDate":"2001-10-13 16:04:11"}]

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值