Java Stream API实战技巧:打造高效优雅的流式数据处理代码

1、Java判断两个集合是否具有交集(三种方法)

package com.interfaces.facade;

import cn.hutool.core.collection.CollectionUtil;
import org.apache.commons.collections.CollectionUtils;

import java.util.Collections;
import java.util.Arrays;
import java.util.List;

/**
 * @Author: CGQ
 */
public class Demo {
    public static void main(String[] args) {
        List<String> aList = Arrays.asList("a");
        List<String> bList = Arrays.asList("b", "c");
        List<String> cList = Arrays.asList("a");
        //1.Collections.disjoint() true为无交集 false为有交集
        if (Collections.disjoint(aList, aList)) System.err.println("无交集");
        //2.CollectionUtils.containsAny() true为有交集 false为无交集
        if (CollectionUtils.containsAny(aList, cList)) System.err.println("有交集");
        //3.CollectionUtil.containsAny() true为有交集 false为无交集
        if (CollectionUtil.containsAny(aList, bList)) System.err.println("有交集");
    }
}

2、Stream流多条件key分组函数

package com.interfaces.facade;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @Author: CGQ
 */
public class Demo {
    public static void main(String[] args) {
        List<User> userList = Arrays.asList(User.builder().userId("1").userName("admin").age("1").build());
        //进行多条件分组函数 条件:userId,userName,age 3个字段创建为分组的key
        Function<User, List<Object>> userKey = user -> Arrays.asList(user.getUserId(), user.getUserName(), user.getAge());
        //将用户集合按照之前创建的userKey当做分组函数的key进行分组
        Map<List<Object>, List<User>> userMap = userList.stream().collect(Collectors.groupingBy(userKey, Collectors.toList()));
        userList.stream().forEach(e -> {
            //根据userId,userName,age 3个字段组的key来进行数据获取
            List<User> users = userMap.get(Arrays.asList(e.getUserId(), e.getUserName(), e.getAge()));
            System.err.println(users);
        });
    }
}

3、Stream流单条件key分组函数(三种方法)

package com.interfaces.facade;

import com.interfaces.vo.User;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @Author: CGQ
 */
public class Demo {
    public static void main(String[] args) {
        List<User> userList = Arrays.asList(User.builder().userId("1").userName("admin").age("1").build());
        //将用户集合按照userId进行分组 分组value为集合 此方法适用与集合中含多个相同主键ID的集合分组value值为对象集合时使用
        Map<String, List<User>> userMap = userList.stream().collect(Collectors.groupingBy(User::getUserId));

        //将用户集合按照userId进行分组 分组value为对象 此方法适用与集合中主键ID唯一的集合分组且value值为某个对象时使用
        Map<String, User> onlyUserMap = userList.stream().collect(Collectors.toMap(User::getUserId, Function.identity()));

        //将用户集合按照userId进行分组 分组value为用户名称(可为对象中任一已字段) 此方法适用与集合中主键ID唯一的集合分组且value值为对象中某一字段时使用
        Map<String, String> userNameMap = userList.stream().collect(Collectors.toMap(User::getUserId, User::getUserName));
        userList.stream().forEach(e -> {
            //根据userId将用户集合按照userId进行分组 分组value为集合
            List<User> users = userMap.get(e.getUserId());
            System.err.println(users);

            //根据userId将用户集合按照userId进行分组 分组value为对象
            User user = onlyUserMap.get(e.getUserId());
            System.err.println(user);

            //根据userId将用户集合按照userId进行分组 分组value为用户名称(可为对象中任一已字段)
            String userName = userNameMap.get(e.getUserId());
            System.err.println(userName);
        });
    }
}

4、Stream流Filter()函数过滤获取结果集(orElse()函数)

package com.interfaces.facade;

import com.interfaces.vo.User;

import java.util.Arrays;
import java.util.List;

/**
 * @Author: CGQ
 */
public class Demo {
    public static void main(String[] args) {
        List<User> userList = Arrays.asList(User.builder().userId("1").userName("admin").age("1").build());
        String userName = "adminErr";
        //根据用户名称获取用户信息  orElse()函数获取不到对应数据返回默认值(可防止空指针异常)
        User user = userList.stream().filter(userVO -> userName.equals(userVO.getUserName())).findFirst().orElse(User.builder().build());
        System.err.println(user);

        //根据用户名称获取用户信息中某字段 orElse()函数获取不到对应数据返回默认值(可防止空指针异常)
        String userId = userList.stream().filter(userVO -> userName.equals(userVO.getUserName())).findFirst().orElse(User.builder().build()).getUserId();
        System.err.println(userId);
    }
}

5、Stream流Map()映射函数方法集

package com.interfaces.facade;

import com.interfaces.vo.User;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import com.interfaces.vo.UserVO;
import org.springframework.beans.BeanUtils;

/**
 * @Author: CGQ
 */
public class Demo {
    public static void main(String[] args) {
        List<User> userList = Arrays.asList(User.builder().userId("1").userName("admin").age("1").build());
        //获取集合中的某字段 User::getUserId
        List<String> userIdList = userList.stream().map(User::getUserId).collect(Collectors.toList());
        System.err.println(userIdList);

        //获取集合中对应条件数据并转换数据类型输出 List<User> --> List<UserVO>
        List<UserVO> userVO = userList.stream().map(user -> {
            UserVO userVOs = UserVO.builder().build();
            if (user.getUserName().equals("admin")) {
                BeanUtils.copyProperties(user, userVOs);
            }
            return userVOs;
        }).collect(Collectors.toList());
        System.err.println(userVO);

        //获取集合中的某字段并转换数据类型  BigDecimal类型
        List<BigDecimal> bigDecimalList = userList.stream().map(User::getAge).map(BigDecimal::new).collect(Collectors.toList());
        System.err.println(bigDecimalList);

        //获取集合中的某字段并转换数据类型  Double类型
        List<Double> doubleList = userList.stream().map(User::getAge).map(Double::new).collect(Collectors.toList());
        System.err.println(doubleList);

        //获取集合中的某字段并转换数据类型  Integer类型
        List<Integer> integerList = userList.stream().map(User::getAge).map(Integer::new).collect(Collectors.toList());
        System.err.println(integerList);

        //获取集合中的某字段并转换数据类型  String类型
        List<String> stringList = userList.stream().map(User::getAge).map(String::new).collect(Collectors.toList());
        System.err.println(stringList);

        //获取集合中的某字段并转换数据类型并进行求和(空自动求和为 0)  BigDecimal类型为精度类型 故计算时常用BigDecimal类型
        BigDecimal summation = userList.stream().map(User::getAge).map(BigDecimal::new).reduce(BigDecimal.ZERO, BigDecimal::add);
        System.err.println(summation);
    }
}

后续会持续更新!!!

后续会持续更新!!!

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值