Java 8 新特性 Stream 的使用场景(不定期更新)

方便在写代码的过程中直接使用,好记性不如好文章,直接 CV 改了直接用。提高 办(摸)公(鱼)效(时)率(间), 不然就直接问 GPT 也不是说不行。

只符合所筛选条件至多一条

java 复制代码
CommonArea l = common.stream().filter(item ->item.getName().equals("aa")).findAny().orElse(null);

返回多条记录

java 复制代码
List<Object> list = common.stream().filter(item -> item.getName().equals("aa"))
	.collect(Collectors.toList())

根据条件判断是否存在

anyMatch:只要有一个就会返回 true

java 复制代码
boolean exist = userData.userList.stream()
                .anyMatch(u -> u.getUserName().equals(user.getUserName()));

allMatch:所有元素都满足就返回 true。

java 复制代码
boolean exist = userData.userList.stream()
                .allMatch(u -> u.getUserName().equals(user.getUserName()));

提取对象 List 中的某一字段生成新的 List:

java 复制代码
List<String> bkMajor = list.stream()
	.map(ZsbBkSchool::getBkMajor)
	.collect(Collectors.toList());

提取对象 List 中的某几个字段生成新的 List:

java 复制代码
List<UserVO> bkMajor = list.stream().map(user -> {
    UserVO vo = new UserVO();
    vo.setUserId(user.getUserId());
    vo.setUserName(user.getUserName());
    return vo;
}).collect(Collectors.toList());

List 集合转字符串,逗号隔开

java 复制代码
// 如何把list集合拼接成以逗号分隔的字符串 a,b,c  
List<String> list = Arrays.asList("a", "b", "c"); 
 
// 第一种方法,可以用stream流  
String join = list.stream().collect(Collectors.joining(","));  
System.out.println(join); // 输出 a,b,c  
 
// 第二种方法,其实String也有join方法可以实现这个功能  
String join = String.join(",", list);  
System.out.println(join); // 输出 a,b,c

List 选取两个字段转 Map

java 复制代码
Map<Integer, String> map = list.stream().collect(Collectors.toMap(Entity::getId, Entity::getType));
// 上面的代码可能会报错(value 为 null 时)
Map<Integer, String> map = list.stream().collect(HashMap::new, (k, v) -> k.put(v.getId(), v.getType()),HashMap::putAll);

List 选取某一个字段作为key,value 为对象转为 Map

java 复制代码
// 使用 Lambda 表达式
Map<Integer,User> userMap = userList.stream().collect(Collectors.toMap(User::getId, User -> User));

// 使用 Function.identity() 简洁写法,也是返回对象本身
Map<Integer,User> userMap = userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));

// 当 key 冲突的解决办法,这里选择第二个 key 覆盖第一个 key
Map<Integer,User> userMap = userList.stream().collect(Collectors.toMap(User::getId, Function.identity(), (key1, key2) -> key2));

List 选取某一个字段作为key,value 为 JSON 字符串

java 复制代码
Map<String, String> collect = userList.stream().collect(Collectors.toMap(User::getOpenId, JSON::toJSONString));

List 选去某一个 BigDecimal 字段或其他数值字段进行相加

java 复制代码
// 使用Stream的reduce方法将BigDecimal字段的值相加
BigDecimal sum = numbers.stream()
    .reduce(BigDecimal.ZERO, BigDecimal::add);

// 使用Stream的mapToInt和sum方法对Item对象的price字段进行累加
BigDecimal total = items.stream()
    .map(Item::getPrice)
    .reduce(BigDecimal.ZERO, BigDecimal::add);

List<Integer> 使用 stream 进行去重

java 复制代码
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5, 6, 6, 7);

List<Integer> distinctNumbers = numbers.stream()
    .distinct()
    .collect(Collectors.toList());

后续将不定期更新 Stream 的骚操作使用,如果有其他更好的使用可以告知一下。

相关推荐
c++之路10 分钟前
Linux进程池与线程池深度解析:设计原理+实战实现(网盘项目架构)
java·linux·架构
阿里云基础软件12 分钟前
当 CPU 莫名抖动时,SysOM Agent 如何 3 分钟定位元凶?
java·阿里云·智能运维·操作系统控制台·sysom
蜜獾云20 分钟前
从linux内核理解Java怎样实现Socket通信
java·linux·运维
wregjru39 分钟前
【读书笔记】Effective C++ 条款5~6:若不想使用编译器自动生成的函数,就该明确拒绝
java·开发语言
华科易迅42 分钟前
SQL学习
java·sql·学习
语戚43 分钟前
从 JVM 底层拆解:i++、++i、i+=1、i=i+1 的实现逻辑与坑点
java·开发语言·jvm·面试·自增·指令·虚拟机
StackNoOverflow1 小时前
Spring核心知识精讲:IoC容器、Bean作用域生命周期与AOP(第二部分)
java·后端·spring
野生技术架构师1 小时前
Java面试精选:数据库 + 数据结构 +JVM+ 网络 +JAVA+ 分布式
java·数据库·面试
你这个代码我看不懂1 小时前
JVM栈、方法区和堆内存
java·开发语言·jvm
学编程就要猛1 小时前
JavaEE初阶:多线程案例
java·开发语言