JDK8 Steam API

2017/05/12 Java8

JAVA STREAM API 一

StreamAPI 相关内容

1.可以从集合,数据,生成器,迭代器中创建stream 2.可以使用filter选择元素,使用map改变元素 3.改变stream的操作包括limit,distinct,sorted 4.要从stream中获得结果 ,使用reduction操作符,如count,max,min,findfirst,findAny等,一些会返回一个Optional值。 5.Optional类型的上的是为了安全地替代使用null值,需要使用ifPresent和orElse 6.可以收集,数据,字符串或者map中的Stream结果 7.Collectors类的groupBy和partitionBy方法可以对stream内容分组,获取每个组的结果 8.Java8对原先类型,int,long,double提供了专门的stream 9.使用并行stream的时候,要确保不能带有副作用,同时要考虑放弃排序约束 10.使用Steam API,会需要一些函数式接口。

迭代器和stream 之间差别

1.stream 不存储元素。 2.stream 不会改变源对象,会返回一个有结果的新的stream 3.stream 操作符可能是延迟执行的。 4.stream 遵循做什么面不是怎么做原则 ,需要描述的是做什么,而不是怎么做,stream就能够内部优化程序的执行。

stream需要三个阶段建立一个流水线 1. 创建一个Stream 2. 一个或者多个步骤中,指定将初始的Stream转换为另一个Stream的中间操作。 3. 使用一个终止操作来产生结果,会强制之前的延迟操作立即执行。然后这个Stream会被终止使用。

创建stream

Java8中可以使用Collection接口中新添加的stream方法,将任意一个集合转化为一个stream ,也可用stream.of将数组转化为一个stream。 Stream.generate可以创建一个无限的Stream,接收一个无参数的函数(Supplier接口的对象),如果要创建序列,使用Stream..iterate( ),接受一个种子和一个函数(UnaryOperator),会对之前的值重用。 Steam实现了AutoCloseable接口,可以使用try-with-resource 语法保证流的自动关闭。

Filter,Map和FlapMap

filter方法的参数是一个Predicate对象,map方法的会对流的对象进行转换,flatmap会将流中的子流展开。

提取子流和组合流

Stream.limit(n)会返回一个包含n 个元素的新流,Steam.skip(n)会丢掉前面的n个元素,Steam.concat可以将两个流连接到一起,当然第一个流不能是无限的。 Stream.peek会产生一个与原始流具有相同元素的流,每次获取元素的时候,会调用一个函数 ,可以用来调试。

有状态的转换

无状态指的是从一个已过滤或者已映射的流中获取某个元素时,结果不依赖之前的元素。Java8也提供了有状态的转换,distinct会返回一个和原始流中相同顺序,抑制了重复元素的新流。

聚合方法

聚合方法都是终止操作,count,max,min,max和min都会返回一个Optional 值,可能会封装返回值,也可能表示没有返回值。 readFirst,findAny,AnyMatch接收一个Predicate对象,allMatch和noneMatch可以通过并行执行来提高速度。

Optional值

Optional值关键在于使用一个具体或者接受正确值或者返回另一个替代值的方法。ifPresent方法的另一种形式可以接受一个函数。可以使用 optionalValue.ifPresent(v->process v) Optional的创建是使用Optional.of(result)或者是Optional.empty()。 如果一个会返回Optional的方法f,并对目标类型T有一个会返回Optional的方法G ,s.f()方法返回的是Optional不是T,但是可以使用Optional=s.f().flatMap(T::g);Optional.flatmap方法类似于一个大小为0或者1的流。

聚合操作

reduce是一种聚合操作,聚合方法有一个聚合操作OP,该聚合会产生(v0)op(v1)op(v2)…其中 (vi)op(v(i+1))表示函数调用 op(vi,v(i+1))的话, 操作就是联合。即(x op y) op z=x op(y op z)。即与组合元素的顺序无关,这样的话, 可以通过并行流进行有效的聚合。(理解为符合运算的分配律就可以用reduce操作) 求和,求积,字符串append,求最大值,求最小值,求并集和交集等。减法不可以。 如果有e 使得e op x=x ,e可以作为计算的起点,这样流就不用处理Optiomnal类。reduce函数也可以使用累加器,并行计算的时候需要对结果进行累加。如下: int result=words.reduce(0,(total,word)->total.word.length(),(total1,total2)->total1+total2)

Show Disqus Comments

Search

    Table of Contents