【问题标题】:Pass input to map lambda as tuple in Scala将输入传递给映射 lambda 作为 Scala 中的元组
【发布时间】:2017-09-24 14:48:58
【问题描述】:

我试图找到一种简洁的方法将两个数组的压缩结果传递到一个映射函数中,即。一种不需要同时声明输入变量并在 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
  }
}

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

【问题讨论】:

标签: scala


【解决方案1】:

你可以……

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

...甚至更圆滑...

val result = numbers1 zip numbers2 map sum

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

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

【讨论】:

  • 类型不匹配是我的一个错误。我已经更正了我的帖子以反映。
  • 你之前的编辑是完美的哈哈,你为什么删除它? :)
  • 我对@9​​87654325@ 发送给sum 的内容有点不理解。不需要元组。
猜你喜欢
  • 2020-06-16
  • 2021-11-14
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
  • 2016-02-10
  • 1970-01-01
  • 2013-08-22
相关资源
最近更新 更多