Java中流与循环的关系

199 阅读4分钟

在这篇博客中,我将探讨使用流和循环的区别以及我们如何管理代码的可维护性。

关于流和循环的性能,有很多意见,哪一个更好呢?

我们知道,流是一个支持各种方法的对象序列,可以通过管道连接来产生所需的结果。

流带来了Java中的函数式编程,Java 8中提供了一个新的附加包,叫做java.util.stream。

这个包由类、接口和枚举组成,允许对元素进行函数式操作。

你可以通过导入java.util.stream包来使用流。

编程语言中的循环是一种功能,它有助于在某些条件评估为真时重复执行一组指令/函数。

流和循环哪个更好?

这完全取决于你希望你的应用程序做什么。

如果原始性能是你的第一要务,那么也许你最好使用循环。

但大多数人并不希望把原始性能作为他们的首要任务。
记住,循环使用的是命令式风格,而流使用的是声明式风格,所以流可能更容易维护。

如果你有一个小的列表,循环的性能会更好。

如果你有一个巨大的列表,并行流会表现得更好。

纯粹从性能的角度考虑,你不应该在ArrayList上使用for-each循环,因为它会创建一个你不需要的额外的Iterator实例(对于LinkedList来说,这是一个不同的问题)。

然而,这是一个不成熟的优化案例。你可能会因为让你的代码不那么容易阅读而赢得几纳秒的时间。

例子

使用字符串

使用循环。

特点:

Java流的特点是:

流不存储元素。它只是通过计算操作的流水线,从数据结构、数组或I/O通道等来源传递元素。

流在本质上是功能性的。

在一个流上进行的操作并不修改源。

例如,过滤一个从集合中获得的流,会产生一个没有过滤元素的新流,而不是从源集合中删除元素。

Stream是懒惰的,只有在需要时才会评估代码。

一个流的元素在流的生命周期内只访问一次。

像迭代器一样,必须生成一个新的流来重新访问源的相同元素。

例子:

现在让我们来探讨一下for a循环。

For循环是一个入口控制的循环,它的内容如下。

初始化表达式初始化了循环控制变量,在循环开始时只执行一次。

它是可选的,可以省略,只需放一个分号。

条件表达式在循环的每次迭代开始时测试。

只要这个条件保持为真,循环就会循环下去。

增量/减量表达式在每次迭代后更新循环控制变量。

循环的主体由需要重复执行的语句组成。

例子:

优势。

流的优点:

流鼓励减少变异性。

流提供了将函数应用于对象序列的最方便和自然的方式。

你的流处理代码不需要知道流的来源或其最终的终止方法。

流可以简洁地表达相当复杂的行为。

流可以替代循环,因为它们允许对数据序列进行处理(类似于循环)。

循环的优点。

使用循环,我们不需要一次又一次地写同样的代码。

世界上有很多经验丰富的程序员,他们有很多语言背景,对他们来说,循环是熟悉的,而流是新颖的。在某些环境下,你想写出那种人熟悉的代码。

认知上的开销:由于它的声明性,以及对下面发生的事情增加了抽象性,你可能需要建立一个新的心理模型,了解代码与执行之间的关系。

实际上,只有当事情出错时,或者当你需要深入分析性能或微妙的错误时,你才需要这样做。

当它 "只是工作 "时,它只是工作。

总结

从性能的角度来看,函数式编程是非常有趣的。

功能性代码经常声明你想达到什么最终结果,而不指定如何实现它。

为了减少项目的维护成本,请务必考虑使用Stream API而不是for循环。