Java8如何构建一个Stream示例详解
Stream初体验
Stream是Java8中操作集合的一个重要特性,我们先来看看Java里面是怎么定义Stream的:
"Asequenceofelementssupportingsequentialandparallelaggregateoperations."
我们来解读一下上面的那句话:
1、Stream是元素的集合,这点让Stream看起来用些类似Iterator;
2、可以支持顺序和并行的对原Stream进行汇聚的操作。
Stream的创建方式有很多种,除了最常见的集合创建,还有其他几种方式。
List转Stream
List继承自Collection接口,而Collection提供了stream()方法。
Listlist=Lists.newArrayList(1,2,3); Stream stream=list.stream();
数组转stream
对于数组,Arrays提供了stream()方法。
String[]arr=newString[]{"a","b","c"};
Streamstream=Arrays.stream(arr);
Map转stream
Map并不是一个序列,不是集合,没办法直接转成stream().但entrySet()是Set,可以转
Mapmap=Maps.newHashMap(); Stream >stream=map.entrySet().stream();
直接创建Stream
Stream也提供了API直接生成一个Stream,这个Stream大概可以理解成一个List。因为内部就是数组实现的。
StreamintegerStream=Stream.of(1,2,3);
读取文件的Stream
用过Linux的就会对其命令行的管道符敬佩不已,一个管道符就可以源源不断的做处理。在Java里读取文件也可以实现类似的功能。
longuniqueWords=0; try(Streamlines=Files.lines(Paths.get("data.txt"),Charset.defaultCharset())){ uniqueWords=lines.flatMap(l->Arrays.stream(l.split(""))) .distinct() .count(); }catch(IOExceptione){ // }
通过函数来生成无限流
Stream提供了iterate来生成一个无限序列,一个基于初始值的无限序列。可以用lambda设置序列的生成规则,比如每次增加2.
Stream.iterate(0,n->n+2) .limit(10) .forEach(System.out::println);
再比如,斐波那契数列(Fibonaccisequence)
Stream.iterate(newint[]{0,1},t->newint[]{t[1],t[0]+t[1]})
.limit(20)
.map(t->t[0])
.forEach(System.out::println);
Stream还提供了另一个generate方法来生成序列。接收一个用户指定的生成序列函数IntSupplier.
IntSupplierfib=newIntSupplier(){
privateintprevious=0;
privateintcurrent=1;
@Override
publicintgetAsInt(){
intoldPrevious=this.previous;
intnextValue=this.previous+this.current;
this.previous=this.current;
this.current=nextValue;
returnoldPrevious;
}
};
IntStream.generate(fib).limit(10).forEach(System.out::println);
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。