这个例子在Java8中使用的流api与for循环相同吗?

这个例子在Java8中使用的流api与for循环相同吗?,java,for-loop,java-8,java-stream,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 Object

这个代码示例是否会完成与下面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 (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
循环相比,流有轻微的开销,但只有在极端情况下,您才能注意到差异

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

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

流更多,而循环的
更多。
这是风格的问题


这也是语言支持的问题。流在Java8中是新的,所以您没有选择旧版本。升级到Java 8时,现有代码很少转换。

是的,它们的功能相同

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

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

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

流更多,而循环的
更多。
这是风格的问题


这也是语言支持的问题。流在Java8中是新的,所以您没有选择旧版本。升级到Java 8时很少转换现有代码。

使用
流的版本不会编译。这是因为所使用的
ObjectOutputStream
方法被声明为抛出已检查异常(
IOException
,在本例中),而
Consumer
的方法
accept()
没有声明任何已检查异常

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

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

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

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

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

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

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

测试时发生了什么?至于为什么要使用
,因为并不是每个人都在使用Java8。Java7没有获得lambdas,因为Java8获得了lambdas。其他原因可能包括兼容性和庞大的现有代码库。区别在于,这两者之一可以工作。另一个由于缺乏适当的异常处理而无法编译…测试时发生了什么?至于为什么要使用
,因为并不是每个人都在使用Java8。Java7没有获得lambdas,因为Java8获得了lambdas。其他原因可能包括兼容性和庞大的现有代码库。区别在于,这两者之一可以工作。另一个不会编译,因为缺乏适当的异常处理…我实际上知道它没有编译我只是没有包括这一点,以强调流api与for循环的区别,但谢谢嵌套循环有时可以使用flatmapping以更可读的方式进行翻译。另一方面,流API还有更多的缺点,比如调试难度更大。@TagirValeev调试的优点——我已经在回答中添加了这一点。就我个人而言,我不喜欢使用
flatMap
来替换嵌套的
for
循环,但我接受这只是一个意见问题。我实际上意识到了这一点,没有编译,我只是没有包括这一点来强调流api与for循环的区别,但是,感谢您嵌套循环有时可以使用flatmapping以更可读的方式进行转换。另一方面,流API还有更多的缺点,比如调试难度更大。@TagirValeev调试的优点——我已经在回答中添加了这一点。就我个人而言,我不喜欢使用
flatMap
来替换
循环的嵌套
,但我接受这只是一个意见问题。