Java8新增的Stream操作集合

1.java8新增了Stream,IntStream,LongStream等,其中Stream是一个通用的流接口.还为每个流式Api提供了对应的Builder,例如Stream.Builder,开发者可以通过这些Builder来创建对应的流.你可能要问什么是Stream?

2.什么是Stream
Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator。原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;高级版本的 Stream,用户只要给出需要对其包含的元素执行什么操作,比如 “过滤掉长度大于 10 的字符串”、“获取每个字符串的首字母”等,Stream 会隐式地在内部进行遍历,做出相应的数据转换。 
Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返。 
而和迭代器又不同的是,Stream 可以并行化操作,迭代器只能命令式地、串行化操作。顾名思义,当使用串行方式去遍历时,每个 item 读完后再读下一个 item。而使用并行去遍历时,数据会被分成多个段,其中每一个都在不同的线程中处理,然后将结果一起输出。Stream 的并行操作依赖于 Java7 中引入的 Fork/Join 框架(JSR166y)来拆分任务和加速处理过程。

Stream和Collection的区别主要有: 
1.stream本身并不存储数据,数据是存储在对应的collection里,或者在需要的时候才生成的; 
2.stream不会修改数据源,总是返回新的stream; 
3.stream的操作是懒执行(lazy)的:仅当最终的结果需要的时候才会执行,比如上面的例子中,结果仅需要前3个长度大于7的字符串,那么在找到前3个长度符合要求的字符串后,filter()将停止执行;

3.独立使用Stream的步骤如下:

1.使用Stream或XxxStream的builder()类方法创建改Stream对应的Builder.

2.重复调用Builder的add()方法向该流中添加多个元素.

3.调用Builder的build()方法获取对应的Stream.

4.调用Stream的聚集方法.

第4步可以根据需求来调用不同的方法,Stream提供了大量的聚集方法供用户调用,对应大部分聚集方法而言,每个Stream只能执行一次.

简单点说就是三步:

1.创建stream; 
2.通过一个或多个中间操作(intermediate operations)将初始stream转换为另一个stream; 
3.通过中止操作(terminal operation)获取结果;该操作触发之前的懒操作的执行,中止操作后,该stream关闭,不能再使用了;

public class demo2 {
	public static void main(String[] args) {
         Builder bd = IntStream.builder().add(15).add(13).add(-9).add(38);         
         IntStream stream = bd.build();  
      System.out.println("stream获取的最大值:"+ stream.max().getAsInt());
      
      System.out.println("stream获取的最小值:"+ stream.min().getAsInt());

上述中 我们打印了一个最大值和一个最小值。然后看打印台

发现 报错了 ,也证实了上面的说法 ,中止操作后,该stream关闭,就不能再使用了;

而且在collection中有Stream接口,所以,用Stream方法来重写集合中我们需要的条件;比如:"返回符合条件的元素的个数"

public static void main(String[] args) {
        Collection<String> books = new HashSet<>();
        books.add("abcdefg");
        books.add("c3p0");
        books.add("1236789");
       Stream<String> str = books.stream();
        System.out.println(str.filter(ele -> ((String) ele).contains("678")).count());

运行方法,看到打印台打印出一个我们要的结果:

那么,我们老拆分出来看看,一步步跟着看一下

  /**
         * 拆开一步步分析来看
         */
        Stream<String> stream = str.filter(ele -> ((String) ele).contains("123"));       
        long count = stream.count();        
        System.out.println(count);

1.首先我们跟进去str.filte 看到如下:

返回是一个Stream类型,参数是一个过滤条件;

关于过滤条件ele -> ((String) ele).contains("678")).count() 我们可以这样认为:

boolean testFunction(String element) 
{
    if (element.contains("678")))
        return true;
    else
        return false;
}

即将集合内所有包含678的条件过滤出来。现代计算机语言往往为了优化编译和运算速度采用lambda表达式的形式,相当于调用一个不需要命名的函数。

接着我们在点stream.count();发现如下:

返回的是一个long类型的。

Stream的转换

构建新的一个Stream

public class demo2 {
	public static void main(String[] args) {
         Builder bd = IntStream.builder().add(15).add(13).add(-9).add(38);         
         IntStream stream = bd.build();  
         //将stream映射成一个新的Stream,新Stream的每个元素是原Stream元素的5倍+2
          IntStream newIs = stream.map(ele -> ele * 5 +2);
          //使用方法引用的方式来遍历集合元素
          newIs.forEach(System.out::println);
          //或者使用lambad來遍歷
          //newIs.forEach(str -> System.out.println(str));

看下输出:

关于stream还有很多,可以自己去看看api的介绍

转载请注明出处:https://blog.csdn.net/FindHuni/article/details/84940311

猜你喜欢

转载自blog.csdn.net/FindHuni/article/details/84940311