传递输入以将lambda映射为Scala中的元组

时间:2017-09-24 05:32:59

标签: scala

我正在尝试找到一种简洁的方法,将两个数组的压缩结果传递给map函数,即。一个不需要声明输入变量并在lambda中使用胖箭头的那个。

这可能甚至不可能,但我想在放弃之前我会问。

第一个示例是工作代码,用于打印以元素方式添加两个数组的结果。 zip的lambda必须在使用之前声明x和y。

第二个例子是非编译代码,它说明了我想用“_”或类似方法做什么来为转换函数提供更好的压缩输入可用性。

示例1

object Example extends App {

  val numbers1: Array[Int] = Array(1,2,3,4,5)
  val numbers2: Array[Int] = Array(9,8,7,6,5)

  val result = (numbers1, numbers2).zipped.map( (x,y) => sum(x,y) )

  result.foreach( println(_) )

  def sum(x: Int, y: Int): Int = {
    x+y
  }
}

当转换函数具有诸如“sum”之类的短名称并且输入数组是基元时,这很好,但是当传入包含转换需要作为参数的若干成员变量的包装器对象的数组时,事情变得更加冗长。

是否有一种语法糖允许这样的东西:?

示例2

object Example extends App {

  val numbers1: Array[Int] = Array(1,2,3,4,5)
  val numbers2: Array[Int] = Array(9,8,7,6,5)

  val result = (numbers1, numbers2).zipped.map( sum(_) )

  result.foreach( println(_) )

  def sum( inputTuple: (Int, Int) ): Int = {
    val x = inputTuple._1
    val y = inputTuple._2
    x + y
  }
}

我越是越清楚,我就越觉得自己已经把自己写进了代码味道,所以如果这就是答案请说明,我会从另一个方向解决问题。

1 个答案:

答案 0 :(得分:3)

你可以......

val result = (numbers1, numbers2).zipped.map(sum)

...甚至更光滑...

val result = numbers1 zip numbers2 map sum

值得注意的是,这种格式允许在sum()方法中使用更自然的参数列表。

def sum(x:Int, y: Int): Int = x + y