Vert.x各種語言中的Lambda寫法

Vert.x v3版本目前支持7種語言,分別是Java, Javascript, Ruby, Groovy, Kotlin, Ceylon & Scala,在主頁上,可以看到七種語言的例子,很有趣的是,例子均由一個Lambda表達式組成,這就給了我們一個機會,窺探並比較一下各個語言的Lambda的寫法。

Java:

import io.vertx.core.AbstractVerticle;npublic class Server extends AbstractVerticle {n public void start() {n vertx.createHttpServer().requestHandler(req -> {n req.response()n .putHeader("content-type", "text/plain")n .end("Hello from Vert.x!");n }).listen(8080);n }n}n

中規中矩的寫法,沒有特別讓人驚喜的地方,熟悉Java8語法的應該能很輕鬆看懂代碼,便於閱讀,沒啥好說的,看下一個;

Javascript:

vertx.createHttpServer()n .requestHandler(function (req) {n req.response()n .putHeader("content-type", "text/plain")n .end("Hello from Vert.x!");n}).listen(8080);n

典型的腳本的Lambda寫法,需要用function關鍵字顯式聲明函數,所以可以看出結構是類似function (param) { ... }的形式,其實腳本的Lambda寫法都差不多,七種語言裡面,Javascript, Ruby和Groovy是腳本語言,所以它們的例子寫法都大同小異。

Ruby:

$vertx.create_http_server().request_handler() { |req|n req.response()n .put_header("content-type", "text/plain")n .end("Hello from Vert.x!")n}.listen(8080)n

看過了Javascript的寫法,再來看Ruby的寫法就很輕鬆了,猜都能猜出來{}裡面||是什麼意思,參數,所以Ruby的Lambda寫法是:{ |param| ... },簡潔不少,不需要顯式聲明function,另外Ruby需要用$聲明全局變數,可以看到例子里的vertx對象是全局的。另外可以看出Ruby的全小寫和下劃線的代碼風格帶有明顯偏前端的色彩。

Groovy:

vertx.createHttpServer().requestHandler({ req ->n req.response()n .putHeader("content-type", "text/plain")n .end("Hello from Vert.x!")n}).listen(8080)n

Groovy的Lambda寫法比較有代表性,Kotlin的Lambda跟Groovy的寫法是一樣的,標準寫法是{ param -> ... },Groovy是真的Java的腳本語言,會Java的程序員可以在半個小時內學會Groovy並開始書寫代碼。

Kotlin:

import io.vertx.core.AbstractVerticlenclass Server : AbstractVerticle() {n override fun start() {n vertx.createHttpServer()n .requestHandler { req ->n req.response()n .putHeader("content-type", "text/plain")n .end("Hello from Vert.x")n }n .listen(8080)n }n}n

由於不再是腳本語言,所以很明顯代碼風格變得跟Java類似,Kotlin的Lambda標準寫法跟Groovy是一致的,但是語法糖更多了一點,體現在:

  1. 當Lambda作為最後一個參數的時候,花括弧{}可以在括弧()以外書寫,比如handler(param1, param2..., { param -> ...}) 等價於handler(param1, param2...) { param -> ...}
  2. 當除了Lambda就沒有其他參數的時候,括弧可以省略,原文中requestHandler就省略了括弧,直接接入花括弧

值得注意的是,Kotlin增加的這個語法糖不僅僅是Kotlin才有,在其他語言中也有可能遇到。

然後是Ceylon:

import io.vertx.ceylon.core { ... }nimport io.vertx.ceylon.core.http { ... }nshared class Server() extends Verticle() {n start() => vertx.createHttpServer()n .requestHandler((req) =>n req.response()n .putHeader("content-type", "text/plain")n .end("Hello from Vert.x!")n ).listen(8080);n}n

Red Hat的私貨語言,除了Red Hat以外沒有多少人在用該語言,Ceylon是Hibernate作者Gavin King到了Red Hat之後發明的面向對象靜態語言,該語言的Lambda寫法跟Scala相同,可以看到原來在Java中的 -> 變成了 =>,其他寫法跟Java是一樣的。

最後是大魔王Scala:

import io.vertx.lang.scala.ScalaVerticlenclass Server extends ScalaVerticle {n override def start(): Unit = {n vertxn .createHttpServer()n .requestHandler(_.response()n .putHeader("content-type", "text/plain")n .end("Hello from Vert.x"))n .listen(8080)n }n}}n

哈哈,Scala的語言特性和語法糖太多了,對付這種小需求,壓根就不需要動用Lambda,直接用一個推導_就解決了其他語言需要寫函數才能表達清楚的意思,這也是Scala的問題,你能看出來這裡的下劃線_表示什麼嗎?

推薦閱讀:

2015 年的今天,Ruby on Rails 還有哪些獨特的價值?
brew升級後ruby報錯怎麼辦?
Ruby基礎語法
使用 Visual Studio 開發的情況下 C# 的編程效率能否和 Python、Ruby 媲美?
什麼人適合學習 Ruby?

TAG:Lambda表达式 | Scala | Ruby |