首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java 8流执行

Java 8流执行
EN

Stack Overflow用户
提问于 2018-08-01 03:24:16
回答 1查看 80关注 0票数 0

你能解释一下下面代码的执行过程吗?主要是sorted方法。

代码语言:javascript
复制
Stream.of("d2", "a2", "b1", "b3", "c")
    .sorted((s1, s2) -> {
        System.out.printf("sort: %s; %s\n", s1, s2);
        return s1.compareTo(s2);
    })
    .filter(s -> {
        System.out.println("filter: " + s);
        return s.startsWith("a");
    })
    .map(s -> {
        System.out.println("map: " + s);
        return s.toUpperCase();
    })
    .forEach(s -> System.out.println("forEach: " + s));

输出:

代码语言:javascript
复制
sort:    a2; d2
sort:    b1; a2
sort:    b1; d2
sort:    b1; a2
sort:    b3; b1
sort:    b3; d2
sort:    c; b3
sort:    c; d2
filter:  a2
map:     a2
forEach: A2
filter:  b1
filter:  b3
filter:  c
filter:  d2

谢谢,裁判:https://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/

EN

回答 1

Stack Overflow用户

发布于 2018-08-01 03:39:37

因此,Java8试图通过对任何给定输入尽可能快地执行所有高阶函数来加快执行速度。也就是说,例如,如果您在list上连续调用map两次,那么它将只访问list的每个元素一次。这加快了它的速度,因为它从2遍历列表到1。为了说明这一点,我们举个简单的例子:

代码语言:javascript
复制
Stream.of(1, 2, 3)
    .map(s -> {
        System.out.println("map: " + s.toString());
        return s;
    })
    .map(s -> {
        System.out.println("map: " + s.toString());
        return s;
    })

这将打印以下内容:

代码语言:javascript
复制
1
1
2
2
3
3

因为“接触”列表中的每个元素一次要比完全遍历两个map的列表要快!

就你的例子而言,让我们一块一块地看:

代码语言:javascript
复制
sort:    a2; d2
sort:    b1; a2
sort:    b1; d2
sort:    b1; a2
sort:    b3; b1
sort:    b3; d2
sort:    c; b3
sort:    c; d2

所有的排序都需要同时进行,而且都需要先进行。这是因为在排序完成之前,计算机无法知道哪个元素将位于哪个点(即,它不能在同一列表位置上映射两次,因为排序可能会改变这种情况)。

接下来,您基本上有了以下内容:

代码语言:javascript
复制
Stream.of("a2", "b1", "b3", "c", "d2")
    .filter(s -> {
        System.out.println("filter: " + s);
        return s.startsWith("a");
     })
    .map(s -> {
        System.out.println("map: " + s);
        return s.toUpperCase();
    })
    .forEach(s -> System.out.println("forEach: " + s));

现在,为了最大限度地减少遍历列表的次数,Java将遍历列表中的每个元素,然后依次执行filtermapforEach。这是因为这些都不依赖于元素的位置。换句话说,Java认为它可以对每个元素执行所有这些操作,而不是对每个函数遍历整个列表三次!

现在:

代码语言:javascript
复制
filter:  a2
map:     a2
forEach: A2

我们对第一个元素进行filter,然后对其进行map,最后进行forEach打印。

代码语言:javascript
复制
filter:  b1
filter:  b3
filter:  c
filter:  d2

这些都被过滤掉了,所以其他的函数就不会被调用了!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51620655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档