我正在学习Scala,并尝试在Arrays
上练习一些示例。下面是示例:
scala>var arr = Array(Array(1,2,3), Array(4,5,6));
scala>arr.map(_.map(_ * 5))
res42: Array[Array[Int]] = Array(Array(5,10,15),Array(20,25,30))
当我尝试以相同的方式对上述数组执行filter
方法时,结果为error
。以下是一段代码以及生成的error
。
scala>arr.filter(_.filter(_ < 5))
<console>:15: error: type mismatch;
found : Array[Int]
required: Boolean
o.filter(_.filter(_ < 5))
^
请说明为什么filter
操作不起作用,在数组数组上使用filter
方法的正确方法是什么?
答案 0 :(得分:2)
如果目标是获得Array(Array(1,2,3), Array(4))
,那么
arr.map(_.filter(_ < 5))
如果目标是获得Array(1,2,3,4)
,那么
arr.flatten.filter(_ < 5)
答案 1 :(得分:2)
首先,如果您对Scala感兴趣,则应该阅读一本好书。使用var是非常糟糕的做法,初学者应避免使用。
关于您的示例,只是为了解释为什么失败,过滤器需要使用返回类型为Boolean
的函数作为参数。在内部过滤器中,您可以正确使用_ < 5
,它会扩展为(x: Int) => x < 5
,该函数将返回true
或false
。但是在外部过滤器上,您使用了_.filter(_ < 5)
,它被扩展为(y: Array[Int]) => y.filter((x: Int) => x < 5)
。这就是问题,y.filter((x: Int) => x < 5)
将返回一个新的Array,这意味着该函数的返回类型不是Boolean
,而是Array[Int]
。
答案 2 :(得分:1)
看看过滤器的签名:
def filter(p: A => Boolean): Repr = filterImpl(p, isFlipped = false)
Filter方法接受Predicate。您可以映射内部数组,然后按规则进行过滤。