Java for 循环指南

本文介绍了如何使用 Java for 循环和 Java Stream 方法。
目前还没有读者喜欢这篇文章。
Coffee beans

Pixabay. CC0.

在编程中,您经常需要代码迭代一组数据,以单独处理每个项目。您使用控制结构来指导程序的流程,而告诉代码要做什么的方式是定义它可以测试的条件。例如,您可能会编写代码来调整图像大小,直到所有图像都调整过一次大小。但是您如何知道有多少图像呢?一个用户可能有五个图像,而另一个用户可能有 100 个。您如何编写可以适应独特用例的代码?在许多语言(包括 Java)中,一种选择是 for 循环。Java 的另一种选择是 Stream 方法。本文涵盖了这两种方法。

For 循环

For 循环接受已知数量的项目,并确保每个项目都得到处理。“项目”可以是数字,也可以是包含多个条目的表,或者任何 Java 数据类型。这本质上描述了一个计数器

  • 计数器的起始值

  • 停止值

  • 您希望计数器前进的增量

例如,假设您有三个项目,并且您希望 Java 处理每个项目。将您的计数器(称之为 c)从 0 开始,因为 Java 从 0 开始数组的索引。将停止值设置为 c < 3c ⇐ 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 循环的基本示例,使用 forEachforEachOrdered 方法是有意义的,这些方法迭代 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

标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,并且经常同时进行。

评论已关闭。

© . All rights reserved.