在数组数组上应用过滤器函数会在Scala中返回异常

时间:2018-10-09 14:05:44

标签: arrays scala multidimensional-array filter

我正在学习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方法的正确方法是什么?

3 个答案:

答案 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,该函数将返回truefalse。但是在外部过滤器上,您使用了_.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。您可以映射内部数组,然后按规则进行过滤。