stream流原理(stream流的原理)

http://www.itjxue.com  2023-02-20 13:46  来源:未知  点击次数: 

Stream流

1.? Collection体系的集合可以使用默认方法stream()生成流(default StreamE stream())

2.? Map体系的集合间接的生成流

3.? 数组可以通过Stream接口的静态方法of(T...values)生成流

1)StreamT filter(Predicate predicate):用于对流中的数据进行过滤

????Predicate接口中的方法 boolean test(T t):对给定的参数进行判断,返回一个布尔值

2)StreamT limit(long maxSize):返回此流中的元素组成的流,截取前指定参数个数的数据

3)StreamT skip(long n):跳过指定参数个数的数据,返回由该流的剩余元素组成的流

4)static T StreamT concat(Stream a, Stream b):合并a和b两个流为一个流

5)StreamT distinct():返回由该流的不同元素(根据Object.equals(Object) )组成的流

6)StreamT sorted():返回由此流的元素组成的流,根据自然顺序排序

7)StreamT sorted(Comparator comparator):返回由该流的元素组成的流,根据提供的Comparator进行排序

8)R StreamR map(Function mapper):返回由给定函数应用于此流的元素的结果组成的流

????????Function接口中的方法 R apply(T t)

9)IntStream mapToInt(ToIntFunction mapper):返回一个IntStream其中包含将给定函数应用于此流的元素的? ?结果

????????IntStream:表示原始 int 流

????????ToIntFunction接口中的方法 int applyAsInt(T value)

练习

现在有两个ArrayList集合,分别存储6名男演员名称和6名女演员名称,要求完成如下的操作

男演员只要名字为3个字的前三人

女演员只要姓林的,并且不要第一个

把过滤后的男演员姓名和女演员姓名合并到一起

把上一步操作后的元素作为构造方法的参数创建演员对象,遍历数据

演员类Actor已经提供,里面有一个成员变量,一个带参构造方法,以及成员变量对应的get/set方法

对数据使用Stream流的方式操作完毕后,我想把流中的数据收集到集合中,该怎么办呢?

Stream流的收集方法:R collect(Collector collector)但是这个收集方法的参数是一个Collector 接口

工具类Collectors提供了具体的收集方式

public static T Collector toList():把元素收集到List集合中

public static T Collector toSet():把元素收集到Set集合中

public static? Collector toMap(Function keyMapper,Function valueMapper):把元素收集到Map集合中

Stream并行流详解

在说到并行的时候,相信很多人都会想到并发的概念。那么并行和并发两者一字之差,有什么区别呢?

并行:多个任务在同一时间点发生,并由不同的cpu进行处理,不互相抢占资源

并行:

并发:多个任务在同一时间点内同时发生了,但由同一个cpu进行处理,互相抢占资源

并发:

当在大量数据处理上,数据并行化可以大量缩短任务的执行时间,将一个数据分解成多个部分,然后并行处理,最 后将多个结果汇总,得到最终结果。

对于并行流,其在底层实现中,是沿用了Java7提供的fork/join分解合并框架进行实现。fork根据cpu核数进行数 据分块,join对各个fork进行合并。实现过程如下所示:

对于并行流,一定不要陷入一个误区:并行一定比串行快。并行在不同的情况下它不一定是比串行快的。影响并行 流性能主要存在5个因素:

1)数据大小:输入数据的大小,直接影响了并行处理的性能。因为在并行内部实现中涉及到了fork/join操作,它 本身就存在性能上的开销。因此只有当数据量很大,使用并行处理才有意义。

2)源数据结构:fork时会对源数据进行分割,数据源的特性直接影响了fork的性能。 ArrayList、数组或IntStream.range,可分解性最佳,因为他们都支持随机读取,因此可以被任意分割。 HashSet、TreeSet,可分解性一般,其虽然可被分解,但因为其内部数据结构,很难被平均分解。 LinkedList、Streams.iterate、BufferedReader.lines,可分解性极差,因为他们长度未知,无法确定在哪里进行 分割。

3)装箱拆箱 尽量使用基本数据类型,避免装箱拆箱。

4)CPU核数 fork的产生数量是与可用CPU核数相关,可用的核数越多,获取的性能提升就会越大。

5)单元处理开销 花在流中每个元素的时间越长,并行操作带来的性能提升就会越明显。

1)基本类型

性能消耗: Stream串行for循环Stream并行

2)对象

性能消耗: Stream串行for循环Stream并行

3)复杂对象

性能消耗: for循环Stream串行Stream并行

结论: 对于简单操作,如果环境机是多核的话,建议使用Stream并行,同时在不考虑核数的情况 下,普通for循环性能要明显高于Stream串行,相差两倍左右。 对于复杂操作,推荐使用Stream API操作。

解释一下Java中的流 Stream?

流(Stream)是字节的源或目的。

两种基本的流是:输入流(Input Stream)和输出流(OutputStream)。可从中读出一系列字节的对象称为输入流。而能向其中写入一系列字节的对象称为输出流。

流的分类:

1:节点流:从特定的地方读写的流类,例如:磁盘或一块内存区域。

2:过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或输出流连接创建的。

(责任编辑:IT教学网)

更多

推荐CGI/Perl教程文章