在编程中,您经常需要代码迭代一组数据,以单独处理每个项目。您使用控制结构来指导程序的流程,而告诉代码要做什么的方式是定义它可以测试的条件。例如,您可能会编写代码来调整图像大小,直到所有图像都调整过一次大小。但是您如何知道有多少图像呢?一个用户可能有五个图像,而另一个用户可能有 100 个。您如何编写可以适应独特用例的代码?在许多语言(包括 Java)中,一种选择是 for 循环。Java 的另一种选择是 Stream 方法。本文涵盖了这两种方法。
For 循环
For 循环接受已知数量的项目,并确保每个项目都得到处理。“项目”可以是数字,也可以是包含多个条目的表,或者任何 Java 数据类型。这本质上描述了一个计数器
-
计数器的起始值
-
停止值
-
您希望计数器前进的增量
例如,假设您有三个项目,并且您希望 Java 处理每个项目。将您的计数器(称之为 c
)从 0 开始,因为 Java 从 0 开始数组的索引。将停止值设置为 c < 3
或 c ⇐ 2
。最后,将计数器递增 1。以下是一些示例代码
package com.opensource.example;
public class Main {
public static void main(String[] args) {
String[] myArray = {"zombie", "apocalypse", "alert" };
for (int i = 0; i < 3; i++) {
System.out.printf("%s ", myArray[i]);
}
}
}
运行代码以确保所有三个项目都得到处理
$ java ./for.java
zombie apocalypse alert
条件是灵活的。您可以递减而不是递增,并且您可以按任意量递增(或递减)。
for 循环是大多数语言中的常见构造。但是,大多数编程语言都在积极开发中,当然,Java 也在不断改进。有一种新的数据迭代方法,称为 Java Stream。
Java Stream
Java Stream 接口是 Java 的一项功能,它提供对结构化数据集合的功能性访问。您无需创建计数器来“遍历”您的数据,而是使用 Stream 方法来查询数据
package com.opensource.example;
import java.util.Arrays;
import java.util.stream.Stream;
public class Example {
public static void main(String[] args) {
// create an array
String[] myArray = new String[]{"plant", "apocalypse", "alert"};
// put array into Stream
Stream<String> myStream = Arrays.stream(myArray);
myStream.forEach(e -> System.out.println(e));
}
}
在此示例代码中,您导入 java.util.stream.Stream
库以访问 Stream 构造,并导入 java.util.Arrays
以将数组移动到 Stream 中。
在代码中,您像往常一样创建一个数组。然后,您创建一个名为 myStream
的流,并将数组中的数据放入其中。这两个步骤通常是 Stream 用法的典型步骤:您有数据,因此将数据放入 Stream 中以便您可以分析它。
您对 Stream 执行的操作取决于您想要实现的目标。Stream 方法在 Java 文档中得到了很好的记录,但是为了模仿 for 循环的基本示例,使用 forEach
或 forEachOrdered
方法是有意义的,这些方法迭代 Stream 中的每个元素。在本示例中,您使用 lambda 表达式创建一个参数,该参数传递给打印语句
$ java ./stream.java
plant
apocalypse
alert
何时使用 Stream
Stream 并非真正为了取代 for 循环而存在。实际上,Stream 旨在作为不需要存储在内存中的临时构造。它们旨在收集数据以进行分析,然后消失。
例如,看看如果您尝试使用 Stream 两次会发生什么
package com.opensource.example;
import java.util.Arrays;
import java.util.stream.Stream;
public class Example {
public static void main(String[] args) {
// create an array
String[] myArray = new String[]{"plant", "apocalypse", "alert"};
// put array into Stream
Stream<String> myStream = Arrays.stream(myArray);
long myCount = myStream.count();
System.out.println(myCount);
}
}
这行不通,这是故意的
$ java ./stream.java
Exception in thread "main"
stream has already been operated upon or closed
Java Stream 的设计理念的一部分是,您将数据引入到您的代码中。然后,您预先应用过滤器,而不是编写一堆 if-then-else 语句来拼命尝试找到您实际想要的数据,处理数据,然后处理掉 Stream。这类似于 Linux 管道,您将应用程序的输出发送到终端,只是为了通过 grep 过滤它,以便您可以忽略所有您不需要的数据。
这是一个简单的过滤器示例,用于消除数据集中任何不以 a
开头的条目
package com.opensource.example;
import java.util.Arrays;
import java.util.stream.Stream;
public class Example {
public static void main(String[] args) {
String[] myArray = new String[]{"plant", "apocalypse", "alert"};
Stream<String> myStream = Arrays.stream(myArray).filter(s -> s.startsWith("a"));
myStream.forEach(e -> System.out.println(e));
}
}
这是输出
$ java ./stream.java
apocalypse
alert
对于您打算在整个代码中用作资源的数据,请使用 for 循环。
对于您想要摄取、解析和忘记的数据,请使用 Stream。
迭代
迭代在编程中很常见,无论您使用 for 循环还是 Stream,了解结构和您拥有的选项都意味着您可以就如何在 Java 中处理数据做出明智的决定。
有关 Stream 的高级用法,请阅读 Chris Hermansen 的文章不喜欢循环?试试 Java Stream。
评论已关闭。