使用continue和流过滤器操作之间的区别

时间:2017-07-04 09:56:31

标签: java java-8 java-stream

使用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);

2 个答案:

答案 0 :(得分:3)

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

  • IF short-circuiting terminal operation,例如:anyMatch被调用,filter将退出,直到第一个满足的元素。

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

其次,流api将使您的代码更加富有表现力

第三,Stream api允许您并行执行一些耗时的操作。但是for循环会花费更多的精力去做,例如:

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

第四,Stream操作可以被序列化,缓存,apache spark核心& streaming api是一个在集群中的节点上处理分布式操作的框架。

答案 1 :(得分:1)

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

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

总而言之,这些都是非功能性优势(两种变体的功能相同),增加了代码质量

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