华为java8_Java8 Stream

简单认识Java stream

Java8出了一个stream流式编程,在开发中或多或少用到接触过。怎么说呢!举个例子把,一起我们在遍历一个集合的时候,我们是从外部去遍历的,然后才能拿到结果,这样来效率就会变得相对低一点。而这个时候我们去内部去遍历集合的时候,直接从内部拿数据。减少资源消耗,提升效率。

什么是stream呢?

Stream它并不是一个容器,它只是对容器的功能进行了增强,添加了很多便利的操作,例如查找、过滤、分组、排序等一系列的操作。并且有串行、并行两种执行模式,并行模式充分的利用了多核处理器的优势,使用fork/join框架进行了任务拆分,同时提高了执行速度。简而言之,Stream就是提供了一种高效且易于使用的处理数据的方式。

首先我们来看下简单的一个执行流程

0d57f6ffd53ee7e5ce7ed77c7e71c87d.png

从这简单的图可以看出,总共就只有三步,相对来说还是比较容易接受。第一步是创建stream这个容器,然后再从这个集合或者数组中去获取这个流。第二步则是一些中间操作,比如对数据进行处理啊。第三步则就是手机我们处理的数据。

例:

public class Stream {

public static void main(String[] args) {

list();//传统for遍历

bigForList();//增强for遍历

iteratorList();//使用迭代器iterator遍历

}

private static void list(){

List list = new ArrayList<>();

list.add(1);

list.add(2);

list.add(3);

int i;

int size;

for (i=0,size=list.size(); i

Integer integer = list.get(i);

System.out.println(integer);

}

}

private static void bigForList(){

List arrlist = new ArrayList<>();

arrlist.add("张三");

arrlist.add("李四");

arrlist.add("王二");

for (String list :arrlist){

System.out.println(list);

}

}

private static void iteratorList(){

List list = new ArrayList<>();

list.add("hello");

list.add("demo");

list.add("test");

Iterator iterator = list.iterator();

while (iterator.hasNext()){

String s = iterator.next();

System.out.println(s);

}

}

以上就是我们我们之前常用的三种遍历方式,可能大家更加倾向于这三种,因为我们在平时开发中或者自己练习的时候。用的比较多,也就慢慢就接受了。但是如果数据量一大?大量数据进行遍历的时候那个这效率,就变得低起来了。所以,steam就出来了。首先我们看看code:

//look code

public static void main (String[] args){

List sList = Arrays.asList("zhangsan","heqing","lisi","...");

//创建顺序流

java.util.stream.Stream stream = sList.stream();

//创建并接流

java.util.stream.Stream stringStream = sList.parallelStream();

stream.forEach(System.out::println);

}

//Arrays.asList

//stream

//parallelStream

stream是顺序流,由主线程按顺序对流执行操作,而parallelStream是并行流,内部以多线程并行执行的方式对流进行操作,需要注意使用并行流的前提是流中的数据处理没有顺序要求(会乱序,即使用了forEachOrdered)。

当然我们也可以去创建一个顺序流

//look code

public static void main (String[] args){

List sList = Arrays.asList(1,2,3,4,5);

//把顺序流通过.parallel()转化为并行流

Optional findFirst = sList.stream().parallel().filter(x->x>5).findFirst();

//创建顺序流

java.util.stream.Stream stream = sList.stream();

//创建并接流

java.util.stream.Stream stringStream = sList.parallelStream();

stream.forEach(System.out::println);

}

在stream中提供了很多方法比如filter;

在以前我们要去一个集合或者数组中筛选我们想要的数据。还要进行一系列的操作,首先创建数组或者集合,然后遍历 然后判断,然后写逻辑等等。。。很麻烦

public static void main(String [] args){

List list= new ArrayList<>();

list.add();

....

for(){

....

....

...

逻辑代码等。。。。

}

}

但是如果用到了stream后就没不会有这么判断条件。切代码量小了,效率高了。谁又不想少写代码呢?早点下班不香吗?

废话不多说,look code;

public static void main(String[] args){

List list = Arrays.asList(1,2,3,4,5,52,46,48,0,12);

java.util.stream.Stream stream= list.stream();

//通过filter过滤去,获取list中大于12的数据

stream.filter(x -> x > 12).forEach(System.out::println);

}

//就三行代码完成,如果按照以前的写法,起码10行把!

还有映射 map、flatMap等

look code

map:一个元素类型为 T 的流转换成元素类型为 R 的流,这个方法传入一个Function的函数式接口,接收一个泛型T,返回泛型R,map函数的定义,返回的流,表示的泛型是R对象;

1

// Stream map(Function super T, ? extends R> mapper);

public static void main(String [] args) {

Stream.of("张三:20").map(s -> {

String[] str = s.split(":");

Person person = new Person(str[0],Integer.valueOf(str[1]));

return person;

}).forEach(Person -> System.out.println(Person));

}

flatMap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。

look code

public static void main(String [] args) {

List list = Arrays.asList("k,l,s,x,z","1,5,2,4,8");

List newList = list.stream().flatMap(s -> {

String[] str = s.split(",");

Stream stream = Arrays.stream(str);

return stream;

}).collect(Collectors.toList());

System.out.println("处理前的集合"+list);

System.out.println("处理后的集合"+newList);

}

总之呢,stream给我们提供了非常大的帮助。只要能够熟练使用的话,确实能够加速开发效率。就会觉得原来写代码居然是那么好玩,easy啦。据说stream加lamda表达式写的代码简直就是像诗一样优美。不过我不知道什么是美。反正lamda用着挺不习惯的。

最后:各位看客老爷万福金安啊。一波三联可以吗?可以吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ascii码扩展 php,php与ascii码

首先 简单说一下历史&#xff0c;ascii码最开始是美国人搞出来的&#xff0c;用来干什么呢&#xff1f;我们知道&#xff0c;计算机只知道0和1&#xff0c;如果我们要计算机识别除了01之外的字符&#xff0c;例如 a&#xff0c;我们要先告诉计算机‘1100001’就是a。跟摩斯密码…

php手机电子相册,免费电子相册制作软件 手机电子相册制作软件

照片配上音乐加上炫酷的过渡效果点缀图片和文字说明&#xff0c;轻松制作成各种视频格式的电子相册。不需要专业的视频制作知识&#xff0c;点几下鼠标就可以把上百张数码照片制作成电子相册。视频相册可以在电脑上用播放器收看或者在高清电视上播放。也可以刻录成DVD、VCD光盘…

php+spl+栈,PHP SPL标准库之数据结构栈(SplStack)介绍

栈(Stack)是一种特殊的线性表&#xff0c;因为它只能在线性表的一端进行插入或删除元素(即进栈和出栈)SplStack就是继承双链表(SplDoublyLinkedList)实现栈。类摘要如下&#xff1a;简单使用如下&#xff1a;//把栈想象成一个颠倒的数组$stack new SplStack();/*** 可见栈和双…

深度理解java jvm,深度理解JVM

深入理解java虚拟机要讲的内容了解历史垃圾回收机制性能监控工具性能调优案例实战认识类的文件结构类加载机制字节码执行引擎虚拟机编译及运行时优化Java线程高级1. 环境搭建安装jdk2. 内存溢出场景模拟public class Test01 {public static void main(String[] args) {//测试内…

otb100matlab,ECO for tracking 在 OTB100 基准测试和 VOT2016 数据集中的实验结果

目前本文所涉内容均未使用图形处理器。运行在有图形处理器环境下的实验将在稍后补充&#xff0c;敬请关注。需要准备的文章和工具有&#xff1a;一、集成 OTB1001.1 下载基准测试在该目录中可以看到&#xff1a;trackers 目录中已经包含了若干跟踪算法。而我们要做的就是把 ECO…

如何设置oracle_home变量,oracle-如何在Ubuntu 9.x上正确设置ORACLE_HOME变量?

oracle-如何在Ubuntu 9.x上正确设置ORACLE_HOME变量&#xff1f;我遇到了与此处列出的问题相同的问题&#xff1a;尽管我没有丢失密码&#xff0c;但如何恢复或更改Oracle sysdba密码&#xff0c;我最初在configure脚本中输入了两次&#xff0c;然后登录(localhost&#xff1a;…

matlab遗传算法配送路径,基于Matlab物流配送路径优化问题遗传算法的实现

维普资讯 http://doc.docsou.com第2 9卷总第 1 1 3期物流商坛物流配送路径优化问题遗传算法的实现The Re lz to f Ge tc Al o ih o a ia i n o ne i g r t m f VRP Ba e o t e M a l b s d n h tap p p p p p p p p p p p p p p ) ≯≯ p p p p ≯ ≯ p≯≯≯≯≯≯≯弓晋丽 .程…

linux挂载目录到分区,Ubuntu7.10下挂载/home目录到一个分区的方法

最近在一个9.5G的旧硬盘上装了个Ubuntu7.10&#xff0c;在安装时选择了自动分区安装&#xff0c;结果只有两个分区&#xff0c;/和swap&#xff0c;后来觉得一妥&#xff0c;就用gparted重新调整了分区&#xff0c;现在想把砍出事的分区挂载/home目录。昨晚试了一晚都没有弄好&…

linux终端美化,如何美化你的命令行终端Terminal

Linux下的终端是很有魅力的&#xff0c;你可以进行些简单的配置让它变得更加华丽&#xff0c;让枯燥的命令行也变得生动起来。下面进行些配置是我使用的&#xff0c;先看下效果图命令行是以我非常喜欢的Avirl为背景的&#xff0c;同时把终端的字体放大了&#xff0c;字体颜色为…

linux重启服务挂载盘消失,如何处理ECS Linux服务器重启服务器、初始化系统后数据盘不见了的情况...

本文在介绍如何处理ECS Linux服务器重启服务器、初始化系统后数据盘不见了的情况的基础上&#xff0c;重点探讨了其具体步骤&#xff0c;本文内容紧凑&#xff0c;希望大家可以有所收获。ECS Linux服务器重启服务器、初始化系统后数据盘不见了问题现象&#xff1a;Linux系统服务…

linux webshell 页面管理,instantbox:30s内快速搭建可通过webshell管理的Linux系统

点击上方蓝色字体&#xff0c;关注我们如何快速搭建一个Linux环境&#xff0c;肯定非docker莫属。但通过instantbox&#xff0c;可以带给我们比docker更好的体验&#xff1a;在不到 30s 内快速搭建一个干净、开箱即用的多个临时的Linux 系统&#xff0c;如Ubuntu、Centos、Arch…

局域网共享工具_局域网文件共享

局域网文件共享的方式都有哪些&#xff1f;局域网文件共享的方式还是比较多的&#xff0c;有几种可参考操作&#xff1a; 在多台电脑上开启网上邻居共享&#xff0c;这样电脑直接打开网上邻居就可以访问对方的文件夹和资料了。 可以安装辅助软件&#xff0c;比如&#xff1a;坚…

sdp ddp内存怎么分_旗舰手机跑分66万+,缩短与PC差距,手机成生产力工具也许不是梦...

现在人们无论是在买电脑还是买手机的时候总是喜欢拿跑分来衡量产品的硬件性能&#xff0c;其实长时间的使用产品才是体验产品性能最真实的体验&#xff0c;但是往往需要先有机会拿到产品才行。除此之外也许跑分是最直观的手段。虽然跑分不代表最终体验&#xff0c;但是通过横向…

安卓虚拟机_安卓中的安卓虚拟机,那些闪退应用有救了

“我们坚持最优质的分享&#xff0c;努力做你身边的资源助手“VMOS VMOS堪称安卓中的安卓虚拟机&#xff0c;可以在手机里面再运行一个全新的安卓系统&#xff0c;由于是独立在运行的操作系统&#xff0c;可以运用的场景非常多&#xff0c;例如多开应用&#xf…

c语言表达式与变量区别,C语言实战开发————基础秘籍1(C与C++的区别,输入输出,函数,变量,运算符)...

(一)学前思考学习目标1 面试2 后期服务 :JNI(C语言)C JAVA 编程思想 编程能力(二)所学内容C语言与C的区别1.C是面向过程 C面向对象2.面向过程与面向对象最大的区别在于前者更直接&#xff0c;但后者略显含蓄&#xff0c;相较于前者而言&#xff0c;后者更为完善&#xff0c;正如…

电脑一开机出rebootand_北京联想电脑维修点【蓝伟博达笔记本维修吧】

联想笔记本电脑维修,多年从事联想笔记本的维修,我公司总结出联想leovo笔记本电脑常见故障,能准确快速判断出联想笔记本出现该故障的相应损坏部件&#xff0c;欢迎联想电脑维修 北京联想笔记本电脑主板维修。用户到店体验、免费检测、一对一维修服务、检测免费&#xff0c;修不好…

c语言用while和if颠倒整数,【连载】(循环执行语句while和if)乐创DIY C语言讲义​——3.8节(3)...

2 循环执行语句计算机有一个强大的能力&#xff0c;快速地重复执行某一计算&#xff0c;这种重复计算多次的方法&#xff0c;是通过软件中的循环执行语句去实现的。C语言中实现循环语句结构的方式有三种&#xff0c;第一种为“for”循环&#xff0c;第二种为“while”循环&…

怎样查看电脑系统版本_用什么软件查维修记录 思域HATCHBACK怎样查询维保记录_汽车事故车查询...

请点击上方快速关注思域HATCHBACK很火。这款被誉为“国产Type R”的思域HATCHBACK版本在三厢车的基础上&#xff0c;集成了更运动化乃至更具战斗感的套件包围、中置排气和手动变速箱。对于本田粉、改装粉、操控粉们而言&#xff0c;“C位客信仰落地”的名言&#xff0c;就像是火…

安卓4.4.4安装哪个微信版本_??微信又更新!暗黑模式可独立设置,新增群接龙固定入口...

前段时间微信支持设置暗黑模式引起了大众的关注&#xff0c;但有小伙伴表示&#xff1a;为啥微信不能单独设置&#xff0c;要随系统变化&#xff1f;这下好了&#xff0c;微信安卓版发布7.0.15内测版本&#xff0c;私信「安卓内测版」即可获取。可以看到&#xff0c;本次内测更…

某系统有6台输出设备 有多个进程均需要使用2台_系统设计硬核知识(4)——操作系统的设备管理...

在计算机系统中&#xff0c;除了处理器和内存之外&#xff0c;其他的大部分硬设备称为外部设备。它包括输入/输出设备&#xff0c;辅存设备及终端设备等。这些设备种类繁多&#xff0c;特性各异&#xff0c;操作方式的差异很大&#xff0c;从而使操作系统的设备管理变得十分繁杂…