【问题标题】:Difference between using continue and stream filter operation [duplicate]使用 continue 和流过滤器操作之间的区别 [重复]
【发布时间】:2017-12-07 17:39:16
【问题描述】:

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

【问题讨论】:

  • 声明式初始化。
  • 我认为stream API 更具可读性
  • 顺便说一句,您的示例不匹配。第一个是你getSiteByName,第二个你没有。您还在未定义的第二个中引用 mSite
  • @Michael 修正了不一致的问题 - 问题更多的是使用 filter 构造循环与 continue

标签: java java-8 java-stream


【解决方案1】:

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

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

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

其次,stream api 会让你的代码更具表现力

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

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

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

【讨论】:

  • @Michael 先生,我的英文不好,如果我有错别字,你可以编辑我的答案。
  • 这个词的形式不对。没什么大不了。 :)
  • @Michael 非常感谢,先生。我正在学习程序也学习英语,:)
【解决方案2】:

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

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

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

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

【讨论】:

  • 我认为在第二段中您的意思是可靠性。弹性是在出现错误时应对的能力。
  • 我也强烈反对 continue 值得完全避免。
  • 谢谢,我现在将“弹性”替换为“可靠性”。
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 2017-03-02
相关资源
最近更新 更多