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

时间:2015-09-18 02:26:27

标签: java for-loop java-8 java-stream

此代码示例是否完成与下面的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 Loop

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();
    }
}

2 个答案:

答案 0 :(得分:3)

是的,它们的功能相同。

与普通的for循环相比,

Streams会有轻微的开销,但只有在极端情况下才会注意到差异。

一个不同之处在于,如果需要,流版本很容易并行,而这需要相当多的代码而不需要流。

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

流量更多functional programmingfor循环为imperative programming 这是一种风格问题。

这也是语言支持的问题。 Streams是Java 8中的新增功能,因此您无法选择旧版本。升级到Java 8时很少转换现有代码。

答案 1 :(得分:2)

使用Stream的版本无法编译。这是因为声明使用ObjectOutputStream的方法抛出一个已检查的异常(在这种情况下为IOException),而accept()的方法Consumer<T>未声明任何已检查的异常异常。

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

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

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