这个例子在Java8中使用的流api与for循环相同吗?
这个代码示例是否会完成与下面for循环相同的任务?如果是,使用for循环和流式API之间的性能差异是什么。如果它们是相同的,那么为什么还要使用for循环呢 流API这个例子在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
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
来替换循环的嵌套,但我接受这只是一个意见问题。