• JAVA常用stream流操作demo演示


    demo关联

    视频讲解地址
    工程地址

    引入

    JAVA的stream流操作是jdk8提供的api,搭配lambda表达式和接口函数简直不要太好用了,下面通过几个经典的例子演示一下map、filter、groupBy的使用。

    准备工作

    引入基础对象

    引入一个user对象,对应的字段如下:

    package online.longzipeng.mywebdemo.entity;
    
    import com.baomidou.mybatisplus.annotation.TableName;
    import com.baomidou.mybatisplus.annotation.TableId;
    import com.baomidou.mybatisplus.annotation.IdType;
    import com.fasterxml.jackson.annotation.JsonFormat;
    import java.util.Date;
    
    import lombok.Builder;
    import lombok.Data;
    
    /**
     * @author lzp
     * @Description: groovy script auto generate 
     */
    @Data
    @TableName("user")
    @Builder
    public class User {
    
        /**
         *  自增id
         */
        @TableId(value = "id", type = IdType.AUTO)
        private Integer id;
    
        /**
         *  nickName
         */
        private String nickName;
    
        /**
         *  年龄
         */
        private Integer age;
    
        /**
         *  1男 2女 0未知
         */
        private Integer sex;
    
        /**
         *  用户名 保证唯一
         */
        private String userName;
    
        /**
         *  创建时间
         */
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
        private Date createTime;
    
    }
    
    

    造数据

    然后咱们使用hutool造一批user数据,注意他们的值都是有规律的,不是乱给的哦

    List<User> users = CollUtil.newArrayList(
    				User.builder().userName("小龙").id(1).age(23).sex(1).build(),
    				User.builder().userName("老王").id(2).age(33).sex(1).build(),
    				User.builder().userName("小白").id(3).age(23).sex(2).build(),
    				User.builder().userName("李华").id(4).age(23).sex(2).build(),
    				User.builder().userName("韩梅梅").id(5).age(18).sex(2).build(),
    				User.builder().userName("大头").id(6).age(25).sex(1).build(),
    				User.builder().userName("张飞").id(7).age(25).sex(1).build()
    		);
    

    stream操作

    然后咱们按照一些指定动作对数据进行操作

    取出id集合

    咱们直接使用stream中的.map 方法就可以实现,代码如下

    /// .map 取出id集合
    List<Integer> ids = users.stream().map(User::getId).collect(Collectors.toList());
    System.out.println("=====================ids为==================================");
    System.out.println(ids);
    

    输出结果为:
    在这里插入图片描述

    取出年龄小于25的对象

    咱们直接使用stream中的.filter 方法就可以实现,代码如下

    /// .filter 年龄小于25的
    List<User> users2 = users.stream().filter(u -> u.getAge() < 25).collect(Collectors.toList());
    System.out.println("=====================年龄小于25================================");
    System.out.println(users2);
    

    输出结果为:
    在这里插入图片描述

    按age分组

    咱们直接使用Collectors.groupingBy方法就可以实现,代码如下

    /// 按age分组
    Map<Integer, List<User>> map1 = users.stream().collect(Collectors.groupingBy(User::getAge));
    System.out.println("=====================按age分组==================================");
    System.out.println(map1);
    

    输出结果为:
    在这里插入图片描述

    按age分组,只留id最大的那一个 k v 形式

    咱们直接使用Collectors.toMap方法就可以实现,代码如下

    /// 按age分组,只留id最大的那一个 k v 形式
    Map<Integer, User> map2 = users.stream()
    		.collect(Collectors.toMap(User::getAge, o -> o, 
    				(o1, o2) -> o1.getId() > o2.getId() ? o1 : o2));
    System.out.println("=====================按age分组,只留id最大的那一个 k v 形式==================================");
    System.out.println(map2);
    

    输出结果为:
    在这里插入图片描述

    完整demo代码

    package online.longzipeng.mywebdemo;
    
    import cn.hutool.core.collection.CollUtil;
    import online.longzipeng.mywebdemo.entity.User;
    
    import java.util.List;
    import java.util.Map;
    import java.util.stream.Collectors;
    
    /**
     * @Author: lzp
     * @description: 常用Stream流演示
     * @Date: 2022/9/20
     */
    public class StreamDemo {
    
    	public static void main(String[] args) {
    		List<User> users = CollUtil.newArrayList(
    				User.builder().userName("小龙").id(1).age(23).sex(1).build(),
    				User.builder().userName("老王").id(2).age(33).sex(1).build(),
    				User.builder().userName("小白").id(3).age(23).sex(2).build(),
    				User.builder().userName("李华").id(4).age(23).sex(2).build(),
    				User.builder().userName("韩梅梅").id(5).age(18).sex(2).build(),
    				User.builder().userName("大头").id(6).age(25).sex(1).build(),
    				User.builder().userName("张飞").id(7).age(25).sex(1).build()
    		);
    		/// .map 取出id集合
    		List<Integer> ids = users.stream().map(User::getId).collect(Collectors.toList());
    		System.out.println("=====================ids为==================================");
    		System.out.println(ids);
    
    		/// .filter 年龄小于25的
    		List<User> users2 = users.stream().filter(u -> u.getAge() < 25).collect(Collectors.toList());
    		System.out.println("=====================年龄小于25==================================");
    		System.out.println(users2);
    
    		/// 按age分组
    		Map<Integer, List<User>> map1 = users.stream().collect(Collectors.groupingBy(User::getAge));
    		System.out.println("=====================按age分组==================================");
    		System.out.println(map1);
    		
    		/// 按age分组,只留id最大的那一个 k v 形式
    		Map<Integer, User> map2 = users.stream()
    				.collect(Collectors.toMap(User::getAge, o -> o,
    						(o1, o2) -> o1.getId() > o2.getId() ? o1 : o2));
    		System.out.println("=====================按age分组,只留id最大的那一个 k v 形式==================================");
    		System.out.println(map2);
    		/// 年龄小于25的 id集合
    		List<Integer> ids2 = users.stream().filter(u -> u.getAge() < 25).map(User::getId).collect(Collectors.toList());
    	}
    }
    
    
  • 相关阅读:
    遥感图像应用:在低分辨率图像上实现洪水损害检测
    C Primer Plus(6) 中文版 第6章 C控制语句:循环 6.8 出口条件循环:do while
    数据中心机房供电配电及能效管理系统设计
    【Pygame】 游戏开发 基础知识
    Kafka - Kafka的安装与命令行操作
    使用kettle采集excel表格中的数据
    JavaIO流01:File类
    UE4 创建暂停和结束游戏UI
    「图论」判环、求环、最小环
    oracle 更新和删除数据
  • 原文地址:https://blog.csdn.net/qq_42365534/article/details/127117419