使用继续和流筛选器操作之间的区别



使用流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
}

streamfilter示例:

sites.stream().filter(apiSite -> {
Site mSite = Site.getSiteByName(apiSite.getName());
return (mSite != null && !deletedSitesToSkip.contains(mSite));
}).map(//some operation);

> 首先,filter行为取决于调用的终端操作。

如果触发短路
  • 终端操作,例如:anyMatchfilter将退出,直到第一个满足的元素。

  • 如果一个非短路终端操作,例如:countcollect被调用,filter的行为就像你的一样。 继续并处理下一个,直到最后一个。

其次,流 API 将使您的代码更具表现力

第三,Stream api 允许你并行执行一些耗时的操作。 但是for循环需要付出更多的努力才能做到这一点,例如:

stream.parallel().map(it-> remoteCall(it)).collect(...);

第四,Stream 操作可以序列化、缓存,apache spark Core & Streaming API 是一个处理集群中节点分布式操作的框架。

流版本具有更好的语义:您可以清楚地对一组数据进行操作,按条件对其进行过滤,并对匹配的元素应用操作。这增加了可读性,并允许通过元素构建块(过滤器,映射(轻松扩展处理,而不会破坏太多(可维护性(。

此外,流操作(用于过滤、映射等(可以设计为可重用的构建块(DRY 原理(,可以单独测试,从而获得可靠性

总而言之,这些都是非功能性的好处(两个变体的功能相同(,增加了代码的质量

此外,continue值得完全避免,因为它在嵌套循环块时会很快导致代码尴尬,使其难以阅读和维护。

最新更新