Java核心技术卷读书笔记------Java SE8的流库(一)

Java SE8的流库

流提供了一种让我们可以在比集合更高的概念级别上指定计算的数据视图。
它是用来以“做什么而非怎么做”的方式处理集合

1.1 从迭代到流的操作

迭代是对集合进行处理时所用到的行为。

//对集合进行迭代操作
        String content = "aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj,kkk,lll,mmm,nnn,o,p,q,r";
        List<String> strings = Arrays.asList(content.split(","));
        long count = 0;
        for (String w : strings){
    
    
            if (w.length()>2)count++;
        }
        System.out.println(count);

流也可以对集合进行操作,会更加简便以及会留有优化的余地。使用流操作的话代码如下所表示:

String content = "aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj,kkk,lll,mmm,nnn,o,p,q,r";
        List<String> strings = Arrays.asList(content.split(","));
        long count1 = strings.stream().filter(w -> w.length()>2).count();

流操作之前并没有接触过,对进行操作的语法十分陌生。w -> w.length()>2。【属于lambda表达式】
流操作的代码无疑更加简洁,而调用不同的方法名,其中的含义也清晰明了,不用再寻找计数的变量名,代码所用位置十分少,便于阅读。
将stream该为parallelStream可以让流库以并行方式执行过滤计数。

long count2 = strings.parallelStream().filter(w -> w.length()>2).count();

流表面看起来和集合十分类似,都可以让我们转换和获取数据,但是它们之间有很大的差异。
1.流并不会存储其元素。这些元素可能存储在底层的集合中,或者是按需生成的。
2.流的操作不会改变其数据源,比如,filter方法不会从新的流中移除元素,而是会生成一个新的流,其中不包含被过滤掉的元素。
3.流的操作是尽可能惰性执行的,这意味着直至需要其结果时,操作才会执行,例如,如果我们只想查找前5个长单词,那么filter方法就会在匹配到第5个单词后停止过滤。因此我们甚至可以操作无限流。
stream和paralleStream方法会产生一个用于strings列表的stream.filter方法会返回另一个流,其中只包含长度大于2的单词,count方法会将这个流化简为一个结果。
这个工作流是操作流时的典型流程,建立了一个包含三个阶段的操作管道:
1.创建一个流。
2.指定将初始流转化为其他流的中间操作,可能包含多个步骤。
3.应用中止操作,从而产生结果,这个操作会强制执行之前的惰性操作,从此之后,这个流就再也不能用了。
在之前的stream示例中,流是用stream方法创建的。filter方法对其进行转换,而count方法是终止操作。
java.util.stream.Stream8
*Stream filter(Predicate<? super T> p)
产生一个流,其中包含当前流中满足P的所有元素。
*long count()
产生当前流中元素的数量,这是一个终止操作。
java.util.Collection 1.2
*default Stream stream()
*default Stream parallelStream()
产生当前集合中所有元素的顺序流或并行流。

1.2 流的创建

首先可以用Collection接口的stream方法将任何集合转换为一个流,如果有一个数组,可以使用静态的Stream.of方法。

String content = "aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj,kkk,lll,mmm,nnn,o,p,q,r";
        Stream<String> stream = Stream.of(content.split(","));

of方法具有可变长参数,因此我们可以构建具有任意数量引元的流。

Stream<String> stringStream = Stream.of("aaa","bbb","ccc","ddd","eee");

使用Arrays.stream(array,from,to)可以从数组中位于from(包括)和to(不包括)的元素中创建一个流。

String content = "aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj,kkk,lll,mmm,nnn,o,p,q,r";
        Stream<String> stream1 = Arrays.stream(content.split(","), 0, 5);

为了创建不包含任何元素的流,可以使用静态的Stream.empty方法。

Stream<String> empty = Stream.empty();

おすすめ

転載: blog.csdn.net/cz_chen_zhuo/article/details/109288429