stream流处理List

本文介绍了如何使用Java 8 Stream API对User对象集合进行操作,包括判断存在性、抽取数据、构造数据结构、赋值、统计、过滤、去重和分页。实例展示了如何通过流处理实现快速查找、数据转换和高效数据处理。
摘要由CSDN通过智能技术生成

前言

这里介绍stream流对集合进行处理的一些常规写法。
这里的集合是对象集合,比例:List、List等。
这里用User作为演示,有以下属性

 /**
     * 序号
     */
    private Integer index;

    /**
     * 用户ID
     */
    private Long userId;

    /**
     * 用户名
     */
    private String userName;

    /**
     * 部门
     */
    private String department;

    /**
     * 部门ID
     */
    private Long departmentId;

    /**
     * 区号
     */
    private Long areaCode;

    /**
     * 账户余额
     */
    private BigDecimal money;

判断是否存在满足条件的数据

例:判断List中,有没有名字叫jack且不在hz的用户

boolean b = userList.stream().anyMatch(e -> "jack".equals(e.getUsername()) && !"hz".equals(e.getAddress()));

抽取数据,构造List

例:抽取出List中的userId

List<Long> codeList = userList.stream().map(User::getUserId).collect(Collectors.toList());

抽取数据,构造Map

//例:抽取出 用户ID和用户名
Map<Long, String> userMap = userList.stream().collect(Collectors.toMap(User::getUserId, User::getUserName));

//例:以address为key,以实体类为value. 注意:key也就是address不可以有重复的值
Map<String, User> userMap1 = userList.stream().collect(Collectors.toMap(User::getAddress, info -> info));

//例:抽取出money小于25的用户ID和用户名
Map<Long, String> userMap2 = userList.stream().filter(c -> c.getMoney().compareTo(new BigDecimal("25")) < 0).collect(Collectors.toMap(User::getUserId, User::getUserName));

//例:根据AreaCode进行分组
Map<Long, List<User>> userMap3 = userList.stream().collect(Collectors.groupingBy(User::getAreaCode));      

赋值

例:给List中的userName赋固定值

userList.stream().forEach(item -> item.setUserName("jack"));

例:给List中的index递增赋值,1,2,3…

Integer[] arr = {1};
userList.stream().peek(e -> e.setIndex(arr[0]++)).collect(Collectors.toList());

例:给List中的department、departmentId同时赋值

userList.stream().forEach(userData -> {
       userData.setDepartment("研发部");
       userData.setDepartmentId(10086L);
});

统计相加

例:把List中每个用户的money相加求和

BigDecimal totalMoney = userList.stream().map(User::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);

过滤

例:取出List中money小于25的用户

List<User> userList2 = userList.stream().filter(item -> item.getMoney().compareTo(new BigDecimal("25")) < 0).collect(Collectors.toList());    

例:取出List中userName=jack的用户,且只要一个jack

Optional<User> result = userList.stream().filter(item -> "jack".equals(item.getUsername())).collect(Collectors.toList()).stream().findFirst();
if(result.isPresent()){
     //查询结果非空
     User user = result.get();
     //do something......
}

例:取出List中,名字叫jack或者tom的用户

 List<User> collect = userList.stream().filter(item -> Arrays.asList("jack", "tom").contains(item.getUsername())).collect(Collectors.toList());

去重

例:根据userId,进行去重

List<User> userList3 = userList.stream().filter(distinctByKey(b -> b.getUserId())).collect(Collectors.toList());

private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        Map<Object, Boolean> seen = new ConcurrentHashMap<>();
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}         

分页/截取

int pageStart = 1;
int pageSize = 10;
List<User> userListPage = userList.stream().skip(pageStart).limit(pageSize).collect(Collectors.toList());        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值