Scala 2中如何对zip操作的结果进行过滤?
正确的Scala实现方式
修复filter写法
你之前的filter语法存在错误,Scala不支持那种混合占位符和类型声明的匿名函数写法。正确的写法可以是两种:
- 用模式匹配提取元组元素:
a.zip(b).filter { case (aItem, _) => aItem.isInstanceOf[C] }
- 直接使用匿名函数参数:
a.zip(b).filter(tuple => tuple._1.isInstanceOf[C])
正确使用collect(推荐)
你之前的collect写法无效是因为泛型类型擦除:JVM运行时无法区分(C, B)和(A, B)的元组类型,所以直接匹配元组整体类型会失效。正确的做法是在模式匹配中单独匹配第一个元素的类型:
a.zip(b).collect { case (cItem: C, bItem) => (cItem, bItem) }
这种写法不仅完成了过滤,还会把结果中第一个元素的类型从A细化为C,更符合Scala的类型安全风格,比isInstanceOf更惯用。
内容的提问来源于stack exchange,提问作者Nordwald
相关产品推荐
相关产品推荐

