使用流filter
操作比使用continue
操作的迭代器有什么优势吗?
迭代for
示例:
for (ApiSite apiSite : sites) {
Site mSite = Site.getSiteByName(apiSite.getName());
if (mSite == null || deletedSitesToSkip.contains(mSite)) {
LOGGER.info("Skipping site: {} as this has been deleted ", apiSite.getName());
continue;
}
// operation
}
stream
filter
示例:
sites.stream().filter(apiSite -> {
Site mSite = Site.getSiteByName(apiSite.getName());
return (mSite != null && !deletedSitesToSkip.contains(mSite));
}).map(//some operation);
> 首先,filter
行为取决于调用的终端操作。
终端操作,例如:
anyMatch
,则filter
将退出,直到第一个满足的元素。如果一个非短路终端操作,例如:
count
,collect
被调用,filter
的行为就像你的一样。 继续并处理下一个,直到最后一个。
其次,流 API 将使您的代码更具表现力。
第三,Stream api 允许你并行执行一些耗时的操作。 但是for
循环需要付出更多的努力才能做到这一点,例如:
stream.parallel().map(it-> remoteCall(it)).collect(...);
第四,Stream 操作可以序列化、缓存,apache spark Core & Streaming API 是一个处理集群中节点分布式操作的框架。
流版本具有更好的语义:您可以清楚地对一组数据进行操作,按条件对其进行过滤,并对匹配的元素应用操作。这增加了可读性,并允许通过元素构建块(过滤器,映射(轻松扩展处理,而不会破坏太多(可维护性(。
此外,流操作(用于过滤、映射等(可以设计为可重用的构建块(DRY 原理(,可以单独测试,从而获得可靠性。
总而言之,这些都是非功能性的好处(两个变体的功能相同(,增加了代码的质量。
此外,continue
值得完全避免,因为它在嵌套循环块时会很快导致代码尴尬,使其难以阅读和维护。