2017-09-21 51 views
4

以下Java 8代碼僅在啓用了日誌記錄功能的情況下,纔會將lambda傳遞給延遲執行generateMessage(...)函數的函數。Scala中Java 8供應商界面的等效代碼

等效的Scala代碼是什麼樣的?

producer.send(true,() -> generateMessage(1, "A Test Message")); 

public void send(boolean enabled, Supplier<ProducerRecord> message) { 
    if (enabled) { 
    something.send(message.get()) 
    } 
} 

回答

6

這是編譯和運行的代碼。希望能幫助到你。

object HelloWorld { 
    def main(args: Array[String]) = { 

     send(true,() => "Foo") 

     def send(enabled: Boolean, supplier:() => String) = 
      if (enabled) somethingSend(supplier()) 

     def somethingSend(message: String) = println(message) 
    } 
} 
5

一個Function0,需要顯式調用:

producer.send(true,() => generateMessage(1, "A Test Message")); 

def send(enabled: Boolean, message:() => ProducerRecord): Unit = { 
    if (enabled) { 
    something.send(message()) 
    } 
} 

或者一個通過名字參數:

producer.send(true, generateMessage(1, "A Test Message")); 

def send(enabled: Boolean, message: => ProducerRecord): Unit = { 
    if (enabled) { 
    something.send(message) 
    } 
} 

在後一種情況下,消息被評估每次使用,如果有的話的時候,但在呼叫站點,它看起來就像普通的方法調用,而不需要手動將其包裝到函數中。

1

可以使用lazy argument延遲parameter評價斯卡拉,如:

// lazy parameter a 
    def foo(a: => Unit) = { 
    println("hello") 
    a 
    } 
    // it will delay eval `println("world")`, and it will eval in `foo.a` 
    foo(println("world")) 
    > hello 
    > world 
+1

懶惰不同於名稱。只有在第一次訪問時纔會評估一個懶惰參數。它們在Scala中不受支持,但可以通過結合使用名稱參數和惰性val來輕鬆模擬。 –

4

供應商相當於將() => ReturnType

def send(enabled: Boolean, message:() => ProducerRecord): Unit { 
    if (enabled) { 
    something.send(message())) 
    } 
}