这个例子在 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
循环尤其不能很好地转换为 Stream
s
此代码示例是否会完成与下面的 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
循环尤其不能很好地转换为Stream
s