Stream API:从迭代器到Stream操作

来源:互联网 发布:java如何解决并发问题 编辑:程序博客网 时间:2024/04/30 01:53

在迭代器中,我们经常会对元素进行处理,如下代码,读取文件stream.txt中的内容,然后截取成单词数组,然后遍历,记录单词长度大于8的个数

    @Test    public void test01() throws IOException {        String contents = new String(Files.readAllBytes(Paths.get("stream.txt")), StandardCharsets.UTF_8);        List<String> words = Arrays.asList(contents.split("[\\P{L}]+"));        int count = 0;        for (String word : words){            if (word.length() > 8){                count ++;            }        }}


在Java8中,可以用Stream来代替,如下代码:

    long countStream = words.stream().filter(w -> w.length() > 8).count();
实现的效果是一样的,不过,我自己测试的,用Stream处理所用的时间比迭代器多不少,以下是测试一个4MB的文件,结果如图:

用Stream的好处是:可以应用在并行运算中

Stream跟集合的区别:

1.Stream自己不会存储元素。元素可能被存储在底层的集合中,或者根据需要产生出来。

2.Stream操作符不会改变源对象。相反,它们会返回一个持有结果的新Stream。

3.Stream操作符可能是延迟执行的。这以为着它们会等到需要结果的时候才执行。


如果需要让Stream API并行执行过滤和统计操作,则只需要将stream()改为parallelStream(),如下代码

long countStream = words.parallelStream().filter(w -> w.length() > 8).count();

Stream通过3个阶段来建立一个操作流水线:

1.创建一个Stream。

2.在一个或多个步骤中,指定将初始Stream转换为另一个Stream的中间操作。

3.使用一个终止操作来产生一个结果。该操作会强制它之前的延迟操作立即执行。在这之后,该Stream就不会再被使用了。

在示例中,通过stream或者parallelStream方法来创建Stream,再通过filter方法对其进行转换,而count就是终止操作。

0 0
原创粉丝点击