【问题标题】:Filtering the results of zip in Scala 2在 Scala 2 中过滤 zip 的结果
【发布时间】:2022-08-05 21:10:36
【问题描述】:

在我的场景中,有三种类型:A、B 和 C,其中 C 是 A 的子类型。

class C extends A
val a: Array[A] = ...
val b: Array[B] = ...

我一直在尝试先压缩ab,然后根据第一个元素的类型过滤结果,但似乎我在这里遗漏了一些东西。

a.zip(b).filter(_: (A, B) => _._1.isInstanceOf[C]

这似乎不起作用,因为 Scala 完全忽略了我在左侧的 _ 类型声明,而在右侧将 _ 键入为 Array[(A, B)]

因为我知道isInstanceOf 不是scala 的做事方式,所以我也考虑过像这样使用collect

a.zip(b).collect{case x: (C, B) => x}

但这不起作用,因为 scala 确实期望这里的类型 (A, B) ,使得类型匹配无用。

我已经习惯了 Python 编程,所以也许我的方法不在这里。将不胜感激任何指向正确方向的指针。

    标签: scala


    【解决方案1】:

    _ 是一个匿名参数,你不“声明”它,所以它是这样的:

    a.zip(b).filter(_._1.isInstanceOf[C])
    

    或这个:

    a.zip(b).filter { x: (A, B) => x._1.isInstanceOf[C] }
    

    (也请注意花括号)

    也可以用偏函数语法写:

    a.zip(b).filter { case (a,b) => a.isInstanceOf[C] }
    

    或更好):

    a.zip(b).filter { 
       case (_: C, _) => true
       case _ => false
    }
    

    或按照您的建议使用collect

    a.zip(b).collect { case x@(_: C, _) => x }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 2018-05-20
      • 1970-01-01
      • 2021-11-22
      • 2012-01-30
      相关资源
      最近更新 更多