Stream的特性、用法、stream().map().collect()用法

您所在的位置:网站首页 stream流中collect Stream的特性、用法、stream().map().collect()用法

Stream的特性、用法、stream().map().collect()用法

2023-03-21 22:23| 来源: 网络整理| 查看: 265

1.举例说明

有一个集合:

List users = getList();

现在想获取User的角色;在后续的逻辑处理中使用;

第一种方法,用for循环:

//定义一个集合存放用户角色 List role = new ArrayList(); for(int i=0;i进行一次或多次逻辑转换操作->进行归约操作形成新的流(最后可以将流转换成集合)。

        stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。        为函数式编程而生。对stream的任何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新stream。        惰式执行:stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。        可消费性:stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。

 

中间操作惰性执行:一个流后面可以跟随0到多个中间操作,主要目的是打开流,并没有真正的去计算,而是做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历,并没有消耗资源。 还有多个中间操作的话,这里的时间复杂度并不是n个for循环,转换操作都是 lazy 的,多个转换操作只会在 Terminal 操作的时候融合起来,一次循环完成。可以这样简单的理解,Stream 里有个操作函数的集合,每次转换操作就是把转换函数放入这个集合中,在Terminal操作的时候循环 Stream 对应的集合,然后对每个元素执行所有的函数。

流的末端操作只能有一次: 当这个操作执行后,流就被使用“光”了,无法再被操作。所以这必定是流的最后一个操作。之后如果想要操作就必须新打开流。

 

关于流被关闭不能再操作的异常:

这里曾经遇到过一个错误:stream has already been operated upon or closed

意思是流已经被关闭了,这是因为当我们使用末端操作之后,流就被关闭了,无法再次被调用,如果我们想重复调用,只能重新打开一个新的流。

3.stream().map(A::B).collect.(Collectors.toList()).contain("**")用法

 //获取所有用户列表信息

List roleList = UserUtils.getUser().getRoleList(); Boolean flag = roleList.stream().map(Role::getEnname).collect(Collectors.toList()).contains("James"); 解释一下,上一句的含义: //1.将用户信息列表转化为流的形式(用stream 代替了for和foreach循环)//2.以map的数据格式获取所有用户的Enname//3.然后把所有的Enname放到一个collect集合中,然后转为List类型//4.最后判断该List中是否包含字符串"James" 4.性能比较

如果数据在1万以内的话,for循环效率高于foreach和stream;如果数据量在10万的时候,stream效率最高,其次是foreach,最后是for。

另外需要注意的是如果数据达到100万的话,parallelStream异步并行处理效率最高,高于foreach和for。

5.stream用法之排序

sorted提供了2个接口:

1、sorted() 默认使用自然序排序, 其中的元素必须实现Comparable 接口 。2、sorted(Comparator


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3