【问题标题】:Filtering a list of objects, looking for a single positive result过滤对象列表,寻找单个阳性结果
【发布时间】:2015-07-03 21:17:10
【问题描述】:

问题:找到一系列对象,并为每个对象检查一个条件,但是我们只需要找到这个条件一次,方法 isWhat 就可以返回它的值。

def isWhat: Boolean = SomeGenerator.findAll().filter(_.someCondition).size > 0

上面的代码将对每个对象调用 someCondition,即使已经发现一个对象具有所需的条件。

总体上有更好的方法来编写此代码,但是让我们假设我们无权修改 someCondition 代码——如果是这种情况,如何在上面的级别编写代码以不进行任何不必要的调用?

想到了流...

【问题讨论】:

  • @user2864740 我不会将数百行代码和大量数据存储拖到示例中:) 它说明了问题的全部。

标签: scala stream


【解决方案1】:

exists 方法在所有标准库集合上都是惰性的(不仅仅是Stream)。例如:

case class Foo(i: Int) {
  def check(): Boolean = {
    printnln(s"Checking $this")
    i > 0
  }
}

然后:

scala> List(Foo(-10), Foo(-50), Foo(1), Foo(-3)).exists(_.check())
Checking Foo(-10)
Checking Foo(-50)
Checking Foo(1)
res2: Boolean = true

这表明一旦我们找到一个通过的元素,我们就会停止检查。

【讨论】:

    【解决方案2】:

    在 Scala 的 List 上定义了一个名为 exists(p: (A) ⇒ Boolean): Boolean 的函数,它将懒惰地评估您的谓词,并在找到元素后立即返回 true,如果没有元素满足您的要求,则返回 false条件

    def isWhat: Boolean = SomeGenerator.findAll().exists(_.someCondition)
    

    【讨论】:

    • 看 - 这就是提问的好处!很棒的答案,就像一个魅力。谢谢!
    【解决方案3】:

    掌心....

    def isWhat: Boolean = SomeGenerator.findAll().toStream.filter(_.someCondition).size > 0
    

    真的那么容易吗?

    这会达到我们的预期吗?

    【讨论】:

    • filter 在这里返回一个流,这不是您可以与整数比较的东西。你能包含更多你的代码吗?
    • 在此处使用流不会真正使您的程序更快
    • 不试图让代码运行得更快@kosii - 试图根本不运行代码:)
    猜你喜欢
    • 1970-01-01
    • 2016-06-05
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2021-12-06
    • 2015-11-28
    相关资源
    最近更新 更多