2016-12-16 3 views
1

Ich spiele mit einigen Lambdas, wo write und flush vom Typ Try[Unit] sind. Ich verschiedene Arten je nachdem, welche Parameter ich aber in die Lambda-Ausdrücke übergeben:(), (Nothing) und _ in Scala

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

Wenn die Lambda-_ => write ist, erhalte ich eine Parametertyp (Nothing), aber wenn es () ist, bekomme ich (). Was ist der Unterschied?

Antwort

2

Wenn die Lambda-_ => write ist, erhalte ich einen Parametertyp von (Nothing)

Nicht ganz. _ fungiert als (Platzhalter und ignorierte) Parameter im Lambda-Ausdruck _ => write, also muss es einen Typ haben, und natürlich kann es sein, was auch immer Sie wollen - von Any bis Nothing in der Scala class hierarchy. Wenn Sie den Typ auslassen, wird der Fehler "Fehlender Parametertyp" angezeigt.

Die leeren Klammern in dem anderen Lambda-Ausdruck () => flush implizieren, dass es keine Parameter übernimmt, was ziemlich genau das ist, was der Rückgabetyp () => Try[Unit] impliziert.

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")) 
} 

zu Java Ein Vergleich, der erste wäre eine regelmäßige Lambda-Ausdruck sein, wo, wie der zweite eine spezifischere Idiom Supplier (wenn man so will) genannt hat.