Java8中的Stream详解
程序员书单
共 4473字,需浏览 9分钟
· 2021-09-07
java8已经发布相当长一段时间了,我工作中一直维护的几个项目发布在很多环境中,我也不敢保证每个环境的JDK都是1.8版本以上的,也就一直没在工作中使用java8的一些新特性
java8刚发布时我学习了一下,写了一些demo,没有及时的进行归档,现在这些demo基本都已经找不到了。在工作中每每遇到对集合进行一些操作时都很头疼,只能不停的对集合进行for循环,有时还需要对同一个集合循环两次以上,不仅效率不高,还浪费服务器资源,数据量大时还可能内存溢出
痛定思痛,我还是决定把学而又忘的java8的新特性进行重新的梳理和学习,本文主要讲如何利用stream对集合进行一系列的操作,包括排序、取最大值、过滤等
没有过多的文字描述,直接上代码。以下代码中的每个方法都可以单独拿出来运行,方便在实际工作中的快速使用
package com.helianxiaowu.java8;
import org.junit.Test;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* @title java8的集合stream操作详解
* @desc
* @author helianxiaowu
* @date 2020/2/1 23:20
*/
public class StreamDemo {
/**
* 获取集合中的最大值或最小值
*/
@Test
public void testMaxAndMin(){
List<Integer> list = Arrays.asList(1, -1, 2, -2);
Integer max = list.stream().max((i, j) -> Integer.compare(i, j)).get();
Integer min = list.stream().min((i, j) -> Integer.compare(i, j)).get();
System.out.printf("max=%s, min=%s", max, min); // max=2, min=-2
}
/**
* 排序
*/
@Test
public void testSorted() {
List<Integer> list = Arrays.asList(1, 4, 3, 2);
// 正序排序
List<Integer> sortedList1 = list.stream().sorted().collect(Collectors.toList());
System.out.printf("sortedList1=%s%n", sortedList1);// sortedList1=[1, 2, 3, 4]
// 倒序排序
List<Integer> sortedList2 = list.stream().sorted((i, j)-> Long.compare(j, i)).collect(Collectors.toList());
System.out.printf("sortedList2=%s", sortedList2);// sortedList2=[4, 3, 2, 1]
}
/**
* 使用map可以访问list中的元素的某些属性或方法
*/
@Test
public void testMap() {
List<String> list = Arrays.asList("a", "java", "helianxiaowu");
// 获取list中的字符串的长度
List<Integer> mapList = list.stream().map(String::length).collect(Collectors.toList());
System.out.printf("mapList=%s%n", mapList); // mapList=[1, 4, 12]
}
/**
* 滤重
*/
@Test
public void testDistinct() {
List<Integer> list = Arrays.asList(1, 2, 2, 3, 3, 3);
List<Integer> distinctList = list.stream().distinct().collect(Collectors.toList());
System.out.printf("distinctList=%s", distinctList); // distinctList=[1, 2, 3]
}
/**
* limit可以取出集合中的前n个元素
*/
@Test
public void testLimit() {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
// 取出前3个元素
List<Integer> limitList = list.stream().limit(3).collect(Collectors.toList());
System.out.printf("limitList=%s", limitList); // limitList=[1, 2, 3]
}
/**
* skip可以去除list中的前n个元素,与limit相反作用
*/
@Test
public void testSkip() {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
// 去除list中的前3个元素
List<Integer> skipList = list.stream().skip(3).collect(Collectors.toList());
System.out.printf("skipList=%s", skipList); // skipList=[4, 5, 6]
}
/**
* 根据条件过滤集合中的元素
*/
@Test
public void testFilter() {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
// 过滤能被2整除的元素
List<Integer> filterList = list.stream().filter(i -> i%2==0).collect(Collectors.toList());
System.out.printf("filterList=%s", filterList); // filterList=[2, 4, 6]
}
/**
* 聚合
*/
@Test
public void testReduce() {
List<Integer> list = Arrays.asList(1, 2, 3, 4);
// 计算list中所有元素的乘积
Integer integer = list.stream().reduce((i, j) -> i * j).get();
System.out.printf("integer=%s", integer); // integer=24
}
/**
* 匹配
* anyMatch 集合中的元素有一个满足条件就返回true
* allMatch 集合中的元素全部满足条件返回true
* noneMatch 集合中的元素都不满足条件返回true
*/
@Test
public void testMatch() {
List<Integer> list = Arrays.asList(1, 2, 3, 4);
// list中有没有大于等于4的元素
boolean b1 = list.stream().anyMatch(i -> i >= 4);
System.out.printf("b1=%s%n", b1);// b1=true
// list中的元素是否全部大于4
boolean b2 = list.stream().allMatch(i -> i > 4);
System.out.printf("b2=%s%n", b2); // b2=false
// list中的元素是否没有大于4的
boolean b3 = list.stream().noneMatch(i -> i > 4);
System.out.printf("b3=%s", b3);// b3=true
}
}
stream使用起来如此方便,或许你会关心它的性能到底如何。可以参考相关的性能测试数据,结论是stream的性能无需担心
— 【 THE END 】— 本公众号全部博文已整理成一个目录,请在公众号里回复「m」获取! 最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 PDF 领取,更多内容陆续奉上。
文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
评论
盘点Lombok的几个骚操作,你绝对没用过!
👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接:http://116.62.199.48/ ,新项目正在酝酿中
小哈学Java
0
堪称最优秀的Docker可视化管理工具——Portainer你真的会用吗?
来源:blog.csdn.net/shark_chili3007/article/details/123366179👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目
小哈学Java
0
JS的这些新特性,你都用过么?
大厂技术 高级前端 Node进阶点击上方 程序员成长指北,关注公众号回复1,加入高级Node交流群作为一门不断演进的语言,JavaScript每年都会引入新特性。这些特性的加入,能够帮助我们编写更加简洁、高效、易于维护的代码。然而,并非所有新特性
程序员成长指北
1
【深度学习】人人都能看懂的LSTM
熟悉深度学习的朋友知道,LSTM是一种RNN模型,可以方便地处理时间序列数据,在NLP等领域有广泛应用。在看了台大李宏毅教授的深度学习视频后,特别是介绍的第一部分RNN以及LSTM,整个人醍醐灌顶。本文就是对视频的记录加上了一些个人的思考。0. 从RNN说起循环神经网络(Recurrent Neur
机器学习初学者
0
测试新人,如何快速上手一个陌生的系统!
大家好,我是狂师!作为刚入行不久的测试新人,面对一个陌生的系统时,可能会感到有些手足无措。面对一个全新的系统系统,如何快速上手并展开有效的测试工作是一个重要的挑战。本文将探讨测试新人如何通过一系列步骤和策略,快速熟悉并掌握新系统的测试要点,从而提高测试效率和质量。本文旨在为测试新手提供一份指导,帮助
测试开发技术
0
如何计算数据中心的冷却需求?
今日分享 【导读】数据中心的冷却要求受多种因素影响,包括设备的热量输出、占地面积、设施设计和电气系统功率额定值等等……众所周知,环境因素会严重影响数据中心设备。过多的热量积聚会损坏服务器,可能导致其自动关闭。经常在高于可接受的温度下运行服务器会缩短其使用
数据中心运维管理
0
多人同时导出 Excel 干崩服务器!新来的阿里大佬给出的解决方案太优雅了!
点击关注公众号,Java 干货及时推送↓推荐阅读:面试辅导,我们出大成果了!来源:juejin.cn/post/7259249904777838629前言 业务诉求:考虑到数据库数据日渐增多,导出会有全量数据的导出,多人同时导出可以会对服务性能造成影响,导出涉及到mysql查询的io操作,
Java技术栈
1
知乎热议:博士生最好的状态是什么?
链接:https://www.zhihu.com/question/447412618编辑:深度学习与计算机视觉声明:仅做学术分享,侵删作者:JackieLeehttps://www.zhihu.com/question/447412618/answer/2963078772最好状态比较难说,最开心
机器学习初学者
0