Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java流与迭代器_Java_Java 8_Iterator_Java Stream - Fatal编程技术网

Java流与迭代器

Java流与迭代器,java,java-8,iterator,java-stream,Java,Java 8,Iterator,Java Stream,我一直在玩Java新的、闪亮的功能部分,其中最让我困惑的是streams 它们有什么用 在谷歌上,我找到的大多是关于如何使用它们的解释和实际例子,我已经记下来了,但对幕后的魔力却没有任何具体的解释,这正是我感兴趣的地方 我的意思不是说从实际意义上讲,我从一些函数式语言中很快地找到了map/filter/reduce/等等,但是为什么我们需要先转换成流呢?Java已经有了迭代器。流和迭代器之间是否有根本的区别,比如一个懒惰,另一个不懒惰?还是别的什么 一句话:迭代器和流之间的根本区别是什么?哪些功

我一直在玩Java新的、闪亮的功能部分,其中最让我困惑的是streams

它们有什么用

在谷歌上,我找到的大多是关于如何使用它们的解释和实际例子,我已经记下来了,但对幕后的魔力却没有任何具体的解释,这正是我感兴趣的地方

我的意思不是说从实际意义上讲,我从一些函数式语言中很快地找到了map/filter/reduce/等等,但是为什么我们需要先转换成流呢?Java已经有了迭代器。流和迭代器之间是否有根本的区别,比如一个懒惰,另一个不懒惰?还是别的什么


一句话:迭代器和流之间的根本区别是什么?哪些功能不能作为迭代器的扩展来实现,需要一个全新的类型系列?

流的方法添加到现有的
迭代器中肯定是可能的,因为可以为所有其他方法提供默认实现,但此API更改具有明显的缺点:

  • 您的流与迭代器“结合”,即使在您不需要迭代器的情况下(例如,生成器流)
  • 您不会“免费”从集合中获取流,就像调用
    stream
    一样,您需要调用
    iterator
    (对于使用迭代器的增强循环,这种情况已经存在)
  • 由于迭代器中没有类似的概念,您仍然需要大量新的基本流类型。这是很难“移植”到迭代器上的功能

将流与迭代器合并的总体收益看起来不多,因此API设计者似乎采取了一种干净的方法。

一般来说,谈论流是一个广泛的话题。然而,我将推导出为什么您应该支持streams API而不是迭代器

首先也是最重要的一点是,使用流API,我们现在可以在更高的抽象级别上编程,就像SQL查询一样,也就是说,我们表达我们想要的内容,并让库处理其余的内容

其次,流操作在幕后执行迭代(内部迭代),这意味着数据处理可以并行进行,或者以不同的顺序进行,这可能会更加优化

另一方面,如果您决定显式地迭代集合以执行某些计算,无论是使用迭代器还是迭代器的语法糖(增强的for循环),那么您将显式地获取集合中的项并逐个处理它们,因此它本质上是串行的

使用迭代器而不是流API也意味着当您想要并行或找到不同的方法来优化您的程序时,还需要做更多的工作

然而,这也意味着你要花更多的时间处理低层次的细节,而不仅仅是专注于你想让你的程序做什么

Java-8 in-Action手册中也提到:

Streams库中的内部迭代可以自动选择 一种数据表示和并行实现,以匹配您的 硬件。相反,一旦您选择了外部迭代 为每个人写作,那么你就基本上承诺了自我管理 相似(自我管理在实践中意味着“一个晴朗的日子” 我们将把这场“或”开始漫长而艰苦的战斗平行化 涉及任务和同步任务“)

Java8需要一个类似集合但没有迭代器的接口,因此 小溪

从本质上讲,使用流API,您的生活在许多方面都变得简单了,但我发现最有用的是,您现在可以投入更多的时间专注于您希望代码做的事情,同时您可以决定在不处理低级内容的情况下进行并行处理

当然,这并不是说在任何可能的地方/任何时候都要使用流。相反,它说明了在迭代器上使用流的好处

在某些地方,使用迭代器比使用流API更合适,反之亦然。因此,明智地选择处理集合中数据的方法

流和迭代器之间有根本区别吗 懒惰而另一个不懒惰?还是别的什么

是的,基本区别在于流是在内部处理的。当我们运行一个流时,我们要说的是我们想要所有这些东西,过滤到这些东西中,在这个条件下,给我们这个结果。我们当然不会说任何我们希望如何实现的事情。这意味着以后相同的源代码可以在图形卡上并行运行,或者以任何未知的方式运行。我们只是想让这一切发生

如果我们作为程序员,明确我们不关心的标准,那么在幕后会发生很多有趣的事情。这也是函数接口和一些lambda表达式背后的魅力所在。这个想法是,如果我们一开始说我们不在乎,那么编译器就可以以解决它的任何方式来解决这些问题,而不是程序说如何解决它。有时,不同的计算机布局可以用不同的方式更好地解决问题,比如更好的并行化

一句话:迭代器和 流以及哪些功能不能作为扩展实现 需要一个全新的类型族吗

迭代器说这个问题需要如何解决。它需要做这个元素,然后这个元素,然后这个元素,编译器不知道是否有某种深层次的,看似隐藏的原因,而不是其他的原因。Streams说你不在乎,在上千个不同的进程上向前向后迭代