使用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);
答案 0 :(得分:3)
首先,filter
行为取决于调用哪个终端操作。
IF short-circuiting terminal operation,例如:anyMatch
被调用,filter
将退出,直到第一个满足的元素。
IF 非短路终端操作,例如:count
,collect
被调用,filter
的行为就像就像你的。继续并处理下一个直到最后一个。
其次,流api将使您的代码更加富有表现力。
第三,Stream api允许您并行执行一些耗时的操作。但是for
循环会花费更多的精力去做,例如:
stream.parallel().map(it-> remoteCall(it)).collect(...);
第四,Stream操作可以被序列化,缓存,apache spark核心& streaming api是一个在集群中的节点上处理分布式操作的框架。
答案 1 :(得分:1)
流版本具有更好的语义:您清楚地对一组数据进行操作,按条件对其进行过滤,并对匹配的元素应用操作。这增加了可读性,并允许通过elementar构建块(过滤器,地图)轻松扩展处理,而不会有太大的破坏风险(可维护性)。
此外,流操作(用于过滤,映射......)可以设计为可重复使用的构建块(DRY原则),可以单独测试,从而获得可靠性。总而言之,这些都是非功能性优势(两种变体的功能相同),增加了代码质量。
此外,continue
值得完全避免,因为它在嵌套循环块时会很快导致代码笨拙,使其难以阅读和维护。