此代码示例是否完成与下面的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();
}
}
答案 0 :(得分:3)
是的,它们的功能相同。
与普通的for
循环相比,Streams会有轻微的开销,但只有在极端情况下才会注意到差异。
一个不同之处在于,如果需要,流版本很容易并行,而这需要相当多的代码而不需要流。
Streams通常比for
循环更简洁,通常允许您在一行代码中完成任务。
流量更多functional programming,for
循环为imperative programming
这是一种风格问题。
这也是语言支持的问题。 Streams是Java 8中的新增功能,因此您无法选择旧版本。升级到Java 8时很少转换现有代码。
答案 1 :(得分:2)
使用Stream
的版本无法编译。这是因为声明使用ObjectOutputStream
的方法抛出一个已检查的异常(在这种情况下为IOException
),而accept()
的方法Consumer<T>
未声明任何已检查的异常异常。
在这种情况下,您应该使用for
循环。
除了已检查异常的此问题外,继续使用for
循环的其他原因包括:
for
循环,for
循环尤其不能很好地转换为Stream
s