问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Java8不可不知的特性——Stream

发布网友 发布时间:2024-09-30 14:53

我来回答

1个回答

热心网友 时间:2024-10-18 00:38

介绍

在写算法题的时候,经常看见其他人对数组或者列表进行操作的时候没有去手动遍历一遍进行操作,而是优雅地用一行代码就能解决。如对一个列表中的所有数排序并取平方:

nums=nums.stream().sorted().map(i->i*i).collect(Collectors.toList())

这便是java8的特性——Stream,这是java8提供的一个抽象概念,能让我们像上面的代码一样声明式地去处理数据。

具体来说就是,它将要处理的元素(数组或列表中的元素)看成是一种流,将这种流在管道中进行处理,比如排序、过滤等等,串行地执行这些操作,最终再通过collect将流转化为原来的数据形式或者变成其他的数据形式。

操作

具体地,我们来讨论流中有那些操作。

排序

就是对元素进行排序,如

List<Integer>nums=Arrays.asList(10,5,8,2,6,1,7);System.out.println(nums.stream().sorted().collect(Collectors.toList()));

结果为

[1,2,5,6,7,8,10]

过滤

根据设置的条件来过滤掉某些不要的元素,如这里只要过滤出小于等于5的元素:

List<Integer>nums=Arrays.asList(10,5,8,2,6,1,7);System.out.println(nums.stream().filter(i->i<=5).collect(Collectors.toList()));

结果为

[5,2,1]

*数量

用于获取指定数量的流,如这里只要5个元素:

List<Integer>nums=Arrays.asList(10,5,8,2,6,1,7);System.out.println(nums.stream().limit(5).collect(Collectors.toList()));

结果为

[10,5,8,2,6]

映射

映射每个元素到对应的结果上,像函数一样,如这里取平方:

List<Integer>nums=Arrays.asList(10,5,8,2,6,1,7);System.out.println(nums.stream().map(i->i*i).collect(Collectors.toList()));

结果为

[100,25,64,4,36,1,49]

并行

除了一般的串行处理,流还能并行地处理数据。只需简单地替换stream()为parallelStream()即可。

这里的并行我思考过是在每个操作的时候处理每个数据时并行,还是针对整个管道,每个操作并行处理。后者显然串行和并行结果会有所不同。经过实验,我发现是前者,即在每个操作的时候处理每个数据时并行。所以每个操作之间的执行还是串行执行的。

List<Integer>nums=Arrays.asList(10,5,8,2,6,1,7);//先过滤再映射System.out.println(nums.parallelStream().filter(i->i<=5).map(i->i*i).collect(Collectors.toList()));//先映射再过滤System.out.println(nums.parallelStream().map(i->i*i).filter(i->i<=5).collect(Collectors.toList()));

结果为

[25,4,1][4,1]Collectors

这个操作就是把流转化为原来的数据形式或者变成其他的数据形式,不仅可以转化回集合,更可以将结果聚合为一个元素,例子如下:

List<Integer>nums=Arrays.asList(10,5,8,2,6,1,7);//转化为列表System.out.println(nums.stream().filter(i->i<=5).map(i->i*i).collect(Collectors.toList()));//聚合成一个元素System.out.println(nums.stream().filter(i->i<=5).map(i->i*i).map(String::valueOf).collect(Collectors.joining("-")));

结果为

[25,4,1]25-4-1

除此之外,jdk还提供许多Collector供开发者使用,并且还可以自定义Collector。由于这里只是入门就不多赘述。

统计

主要用于数值型元素上,可以方便地获得一些最大最小值、平均值等统计结果。

List<Integer>nums=Arrays.asList(10,5,8,2,6,1,7);IntSummaryStatisticsstats=nums.stream().mapToInt((x)->x).summaryStatistics();System.out.println(stats);System.out.println("最大值:"+stats.getMax());System.out.println("最小值:"+stats.getMin());System.out.println("平均数:"+stats.getAverage());System.out.println("所有元素之和:"+stats.getSum());

结果为

List<Integer>nums=Arrays.asList(10,5,8,2,6,1,7);System.out.println(nums.stream().sorted().collect(Collectors.toList()));0总结

这篇文章就是对Stream特性的一个入门探索,关于它其实还有很多内容,自定义程度非常的高,不过了解本文这些基本的操作与流式思想就基本够用在一些简单应用上了。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 黑客攻击报案有用吗 腋窝里面长了个疙瘩还疼怎么办 张家港新城和樾地址在哪里? 腋窝长小疙瘩,疼!前几年右侧腋窝下长个小疙瘩,特别疼,有点像粉刺,朋友... 适合拌饭吃的酱料有哪些? 三国群英传之隋唐风云推荐配置 我今年18.身体左侧胳膊左背酸痛,左侧腋窝有个黄豆粒大小的硬块,不痛不... 韩式拌饭酱哪个牌子好 三国群英传之隋唐风云里武将编号 怎样取消安全模式自动启动功能? ...小疙瘩...碰它会有点发疼,我今年才18岁,请问怎么回事阿???_百度知... 三国群英传之隋唐风云简介 三国群英传之隋唐风云游戏安装说明 ...是苹果5的跟我老婆是用一个ID,怎么取消啊?求大神解决 苹果手机在哪查经纬度 春季养生 川贝红酒炖雪梨 笔记本外用键盘插在USB接口上不能用,只有三个灯闪了一下就没亮了 笔记本外接键盘数字键不能用,Num Lock键的指示灯是亮的 梦见烈火人头 如何判断车身位置?左脚是左侧车轮,右脚是右侧车轮,刹车是中间_百度知 ... 五月份全国旅游景点排行榜 如何删除哔哩哔哩视频的评论 Stream流的详细用法 淘宝、天猫与马云之间有什么关系? Java8新特性-Stream流&amp;Optional类 ...好的事不要发生,多做善事 一切顺利 一切平安,家人平安? 我的是固态硬盘做系统盘!电脑经常蓝屏!蓝屏后就找不到系统盘!要拔掉连... 凉拌苹果怎么做 安装win7时候蓝屏-(安装win7蓝屏0x000000a5) Windows下安装Anaconda及基础使用并添加到pycharm环境中 老婆做梦数钱是什么意思? 室内的wlan和现在移动,电信的wlan有什么区别? ...梦见和前任手牵手 很开心的样子 能醒来却发现是个梦,好希望不是梦... WLAN是各大运营商通用,的还是电信有电信WLAN,联通有联通WLAN,移动有移 ... 昨晚梦见他了,梦中的他好温柔,他还是和以前一样把他家的钥匙给我,醒来... ...那个人在现实中并不存在。醒来后发现他是个梦里的人、心里特别难受... 奥数书哪个版本比较好 小学奥数书哪个好 奥数书哪个好 为什么一觉醒来眼睛肿了 一觉醒来眼睛肿了是怎么回事