**
JDK8 Stream 流
**
概述
继Java 8系列之Lambda表达式之后,我们来了解Stream。Stream 是用函数式编程方式在集合类上进行复杂操作的工具,其集成了Java 8中的众多新特性之一的聚合操作,开发者可以更容易地使用Lambda表达式,并且更方便地实现对集合的查找、遍历、过滤以及常见计算等。
创建Stream
我们有多种方式生成Stream:
- Stream接口的静态工厂方法(注意:Java8里接口可以带静态方法);
- Collection接口和数组转换成Stream ;
- 通过Stream.of(T) 静态方法创建流;
Stream API 使用:
filter
filter方法对原Stream按照指定条件过滤,在新建的Stream中,只包含满足条件的元素,将不满足条件的元素过滤掉。
ArrayList<String> list = new ArrayList<String>();
list.add("A1");
list.add("A2");
list.add("A3");
list.add("A4");
list.add("A5");
Stream<String> stream = list.stream(); //collection 转 stream
list.stream().filter((str)->str != "A4").forEach((str)->System.out.println(str));
forEach
forEach方法前面已经用了好多次,其用于遍历Stream中的所元素,避免了使用for循环,让代码更简洁,逻辑更清晰。
Stream.of("1","2").forEach((str)->System.out.println(str));
map
map方法将对于Stream中包含的元素使用给定的转换函数进行转换操作,新生成的Stream只包含转换生成的元素。为了提高处理效率,官方已封装好了,三种变形:mapToDouble,mapToInt,mapToLong。其实很好理解,如果想将原Stream中的数据类型,转换为double,int或者是long是可以调用相对应的方法。
Stream<String> stream2 = Stream.of("1","2","3");
// map 方法参数 function<T,R> 相当于映射 将T转为R类型
Stream<Integer> stream2New = stream2.map((str)->{return Integer.parseInt(str);});
stream2New.forEach((str)->System.out.println(str));
count
count方法将返回Stream中元素的个数。(相当于集合中size)
Stream<String> stream3 = Stream.of("1","2","3");
System.out.println(stream3.count()); //相当于集合中的size 统计元素个数
limit
limit方法将截取原Stream,截取后Stream的最大长度不能超过指定值N。如果原Stream的元素个数大于N,将截取原Stream的前N个元素;如果原Stream的元素个数小于或等于N,将截取原Stream中的所有元素。
Stream<String> stream4 = Stream.of("1","2","3");
stream4.limit(2).forEach((str)->System.out.println(str)); //将stream 中的数据进行截取 返回新的流
skip
skip方法将过滤掉原Stream中的前N个元素,返回剩下的元素所组成的新Stream。如果原Stream的元素个数大于N,将返回原Stream的后(原Stream长度-N)个元素所组成的新Stream;如果原Stream的元素个数小于或等于N,将返回一个空Stream。
Stream<String> stream5 = Stream.of("1","2","3");
stream5.skip(2).forEach((str)->System.out.println(str)); //从stream 中跳过指定索引的流,指定索引大于索引个数将返回空流
concat
concat方法将两个Stream连接在一起,合成一个Stream。若两个输入的Stream都时排序的,则新Stream也是排序的;若输入的Stream中任何一个是并行的,则新的Stream也是并行的;若关闭新的Stream时,原两个输入的Stream都将执行关闭处理
Stream<String> streamA = Stream.of("1","2","3");
Stream<String> streamB = Stream.of("3","2","1");
Stream.concat(streamA, streamB).forEach((str)->System.out.println(str)); //stream 静态方法 concat 将两个流合并一起返回新流
持续更新~