2017-09-24 32 views
0

我試圖找到一個簡潔的方式來傳遞壓縮兩個數組到地圖函數,即結果。一個不需要聲明輸入變量並在lambda中使用胖箭頭。傳遞輸入映射lambda作爲元組在斯卡拉

這可能不可能,但我想我會問,之前放棄。

第一個示例是工作代碼,它打印以元素方式添加兩個數組的結果。拉鍊的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 
    } 
} 

這是正常時,變換函數具有像「總和」和輸入陣列是圖元的短名稱,但通過在包裝對象的陣列,當事情變得更詳細的這包含轉換需要的多個成員變量作爲參數。

是否有一個允許類似這樣的語法糖:?

例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 
    } 
} 

我越詳細介紹這個我越覺得像我自己寫進碼味,所以如果那答案請說出來,我會去解決從另一個問題方向。

+0

你可能會尋找[箭類型類](http://eed3si9n.com/learning-scalaz/Arrow.html) –

回答

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 
+0

的類型不匹配是由於我的錯誤。我已更正了我的帖子以反映。 –

+0

你以前的編輯是完美的哈哈,你爲什麼刪除它? :) –

+0

我已經得到了什麼'地圖'發送到'sum'。 Tupling不需要。 – jwvh