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());
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值