为什么Java 8中的函数式构造被称为“流”?

3

“流”这个术语传统上与I/O操作有关。Java为什么选择“流”这个术语作为它们的函数式操作名称?


过于宽泛,基于个人观点。 - markspace
这是一个词源学问题 - 它的措辞不正确吗?还是词源学问题仍然太宽泛了? - neverendingqs
你认为“词源学”是一个编程问答网站的主题吗? - Holger
5
重新开放投票:我已经草拟了一个基于Java 8开发历史的答案。 - Stuart Marks
2
@StuartMarks 这个问题已经重新开放。 - rgettman
1
@rgettman 感谢通知。已回答。 - Stuart Marks
2个回答

7

"流"不一定与I/O有关,而是一个泛化的概念,指的是信息在系统中流动。

流处理(由Mr.Me提供的维基百科链接)的概念与SIMD处理或基于向量的计算有关,这也类似于Java 8 Streams API所提供的计算风格。

然而,我认为Java 8中“流”这个概念的主要灵感来自于这本书:Structure and Interpretation of Computer Programs, 2/e. Abelson, Sussman, 和Sussman. MIT Press, 1996. (该书可以在MIT Press网站免费阅读。)

以下是我精装版书的第217-218页上章节介绍部分的一些摘录:模块化、对象和状态

在本章中,我们将探究两种显著的组织策略,这些策略源于系统结构的两种不同“世界观”。第一种组织策略集中于对象,将大型系统视为由行为可能随时间变化的不同对象组成的集合。另一种组织策略集中于流动在系统中的信息流,就像电气工程师看待信号处理系统一样。
...
在计算模型中处理对象、变化和标识的困难是对时间进行斗争的基本结果。当我们允许程序并发执行的可能性时,这些困难变得更加严重。当我们将模型中的模拟时间与计算机评估期间发生的事件顺序解耦时,可以最充分地利用流方法。我们将使用一种称为延迟评估的技术来实现这一点。
第3.5节(,第316页及以下)详细讨论了流方法。
Java 8的Streams与SICP引入的流有所不同。但是一些基本概念,如不可变性、延迟评估和值通过系统流动,而不是就地改变值,非常相似。上面提到的“与时间搏斗”的概念似乎让人想起Java 8 Streams中关于“遭遇顺序”与“处理顺序”的问题。
在我们开发该系统时,我们围绕着许多不同的词来描述库所尝试表示的内容。最终我们使用“streams”这个词比其他任何词都要多,并且它被保留了下来。

2

流处理是一个广泛的概念,其中反应式函数编程已经出现。

这个想法是围绕数据的变化构建任务,这些变化通常被称为事件,但每次新数据被推送到流中,或者发生更改时,任务会执行以处理它。

例如,在函数响应式编程中,您可能希望监听按钮上的单击事件,每次单击发生时,一个新对象被推送到事件流中,您可以处理它。

因此,即使您构建的代码(任务)与流没有任何关系,而只是适当地处理新值。背后的引擎/概念是数据的编年史流。

这类似于输入输出流,在某种意义上,数据也是按顺序流动的。

了解更多:阅读此博客文章


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接