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