2016-12-16 9 views
1

私はいくつかのラムダで遊んでいます。writeflushTry[Unit]です。私も、私はラムダに渡すどのようなパラメータに応じて、異なる種類を取得:()、(Nothing)、Scalaの_

val writeLambda: (Nothing) => Try[Unit] = _ => write 
val flushLambda:() => Try[Unit] =() => flush 

ラムダが_ => writeであれば、私は(Nothing)のパラメータの型を取得しますが、それは()であれば、私は()を取得します。違いはなんですか?

答えて

2

ラムダが_ => writeであれば、私は(Nothing)

正確

ないのパラメータの型を取得します。 _は、ラムダ式_ => writeの(ワイルドカードと無視された)パラメータとして機能するので、何らかの型を持たなければなりません。そして、AnyNothingからScala class hierarchyまでの任意の型にすることができます。タイプを省略すると、「欠落しているパラメータタイプ」のエラーになります。

他のラムダ式() => flushの空の括弧は、パラメータを取っていないことを意味しています。これは戻り値の型() => Try[Unit]の意味です。 Javaへの比較

import scala.util.Try 

object TestObject { 
    def main(args: Array[String]): Unit = { 
    val writeLambda: (Any => Try[Unit]) = { _ => write } 
    val flushLambda: (() => Try[Unit]) = {() => flush } 

    writeLambda(Map("one" -> Option(BigDecimal(1)))) // prints "write" 
    writeLambda(List(1, 2, 3)) // prints "write" 
    writeLambda(None) // prints "write" 
    writeLambda(1) // prints "write" 
    writeLambda() // prints "write" 

    flushLambda() // prints "flush" 
    flushLambda(None) // won't compile because "Too many arguments" 
    } 

    def write: Try[Unit] = Try(println("write")) 
    def flush: Try[Unit] = Try(println("flush")) 
} 

、最初のものは、第1のSupplierと呼ばれる、より具体的なイディオム(あなたがするかどうかを)持っているとして、正規ラムダ式になります。

関連する問題