Java 8 集合之流式(Streams)操作, Streams API 详解
2024-08-31 21:20:30
因为当时公司的业务需要对集合进行各种各样的业务逻辑操作,为了提高性能,就用到了这个东西,因为以往我们以前用集合都是需要去遍历(串行),所以效率和性能都不是特别的好,而Streams就可以使用并行的方式来操作集合。
Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返。
而和迭代器又不同的是,Stream 可以并行化操作,迭代器只能命令式地、串行化操作。顾名思义,当使用串行方式去遍历时,每个 item 读完后再读下一个 item。而使用并行去遍历时,数据会被分成多个段,其中每一个都在不同的线程中处理,然后将结果一起输出。
Java 的并行 API 演变历程基本如下:
- 1.0-1.4 中的 java.lang.Thread
- 5.0 中的 java.util.concurrent
- 6.0 中的 Phasers 等
- 7.0 中的 Fork/Join 框架
- 8.0 中的 Lambda
1.首先我们来看一个例子:
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
如果我们要筛选出大于1的数据,按照以往的做法是,去遍历集合,筛选出大于1的,然后用一个新的list去add,例如下面:
List<Integer> templist = new ArrayList<>();
for (Integer integer : list) {
if (integer > 1){
templist.add(integer);
}
}
但是如果用到了Streams操作的话,我们可以换一种写法,比如下面这样写: list.stream().filter(l -> l>1).collect(Collectors.toList()); 这个意思就是用filter筛选出大于1的数据,并且返回一个list,注意标红的表达式,这个表达式需要返回布尔值,所以可以有很多玩法,自己可以探究噢,
2.还有一种常用的例子
比如我想改变list种的某一个数据,然后list的其他的都不变,
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4); list.stream().map(l ->{
if (l .equals(1)){
return l;
}
return l;
}).collect(Collectors.toList());
这个的Streams种的map就是可以在里面写一些其中的业务逻辑,然后再return,List中包含的数据,当然还有很多种玩法,比如:
List<
String
> output = wordList.stream().
map(String::toUpperCase).
collect(Collectors.toList());
这是平常用的比较多的2种对集合操作的StreamsAPI,如果大家对这个很感兴趣,还想了解更多的玩法的话可以访问:
https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/
最新文章
- ssh框架介绍
- 【BZOJ】【1009】 【HNOI2008】GT考试
- bzoj 2049: [Sdoi2008]Cave 洞穴勘测
- CString转换成int CString类相应函数
- Python脚本控制的WebDriver 常用操作 <;二十>; 处理表单元素
- HMM模型
- 数学:UVAoj 11174 Stand in a Line
- 20151203--filter
- 提醒录入BOM更改原因
- SDK does not contain any platforms. error (android)
- 腾讯发布 Omix 1.0 - 用 JSX 或 hyperscript 创建用户界面
- Java(Android)线程池zz
- Linux 小知识翻译 - 「Unix」和「兼容Unix的OS」
- js怎么把一个数组里面的值作为一个属性添加到另一数组包含的对象里(小程序)
- FMDB基本操作
- $@和 $*-linux_Shell
- ASIC中的一些库和文件类型
- bzoj 2011
- css hack 和问题
- 白盒测试实践-任务进度-Day05
热门文章
- Don&#39;t rely on luck.
- Linux 系统管理——文件系统与LVM、磁盘配额实例
- 【dp】P1064 金明的预算方案
- shell 杀死80端口的所有进程
- JavaScript中class类的介绍
- sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock
- OpenFOAM计算结果转换到CFD-Post当中处理
- [Beta]第一次 Scrum Meeting
- 【软工实践】Beta冲刺(5/5)
- 【转】使用eclipse的todo标签管理任务