这个例子在 Java 8 中使用流 api 和 for 循环一样吗?

Is this example using the stream api in Java 8 the same as a for loop?

此代码示例是否会完成与下面的 for 循环相同的任务?如果是,使用 for 循环和流式处理之间的性能差异是什么 API。如果它们相同,那为什么还要使用 for 循环呢?

流API

currentStatuses.stream().filter(status -> !statuses.contains(status)).forEach(status -> {
    retweetAndFavorite(status);
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("tweets.txt")));
    oos.writeObject(currentStatuses);
    oos.close()
});

For循环

for (Status status : currentStatuses)
{
    if (!statuses.contains(status))
    {
         retweetAndFavorite(status);
         ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("tweets.txt")));
         oos.writeObject(currentStatuses);
         oos.close();
    }
}

是的,它们的功能相同。

与普通的 for 循环相比,流有轻微的开销,但只有在极端情况下您才能注意到差异。

一个区别是,如果需要,流版本很容易实现并行,而这需要相当多的没有流的代码。

流通常比 for 循环更简洁,通常允许您在一行代码中完成任务。

流更多 functional programming, while a for loop is imperative programming
这是风格问题。

也是语言支持的问题。 Streams 是 Java 8 中的新功能,因此您无法选择旧版本。升级到 Java 8.

时很少转换现有代码

您使用 Stream 的版本无法编译。这是因为使用的 ObjectOutputStream 的方法被声明为抛出检查异常(在本例中为 IOException),而 Consumer<T> 的方法 accept() 没有声明任何检查异常例外。

在这种情况下,您应该使用 for 循环。

除了检查异常的这个问题,继续使用 for 循环的其他原因包括:

  • 与早期版本和现有代码的兼容性,
  • 在外部声明的 lambda 中使用的任何变量都必须是有效的最终变量,但此限制不适用于 for 循环,
  • 更容易调试
  • 可读性。嵌套 for 循环尤其不能很好地转换为 Streams