Scala的ACM轉換

541732025發表於2015-12-01
SAM-single abstract method
在Scala中,要某個函式做某件事時,會傳一個函式引數給它。而在Java中,並不支援傳送引數。
通常Java的實現方式是將動作放在一個實現某介面的類中,然後將該類的一個例項傳遞給另一個方法。
很多時候,這些介面只有單個抽象方法(single abstract method),在Java中被稱為SAM型別。


點選(此處)摺疊或開啟

  1. object SAM {

  2.   def main(args: Array[String]){
  3.     
  4.     var data = 0
  5.     val frame = new JFrame("SAM Testing");
  6.     val jButton = new JButton("Counter")
  7.   
  8.     //這是java實現方式
  9.     jButton.addActionListener(new ActionListener {
  10.      override def actionPerformed(event: ActionEvent) {
  11.      data += 1
  12.      println(data) //其實這兩行才是核心處理邏輯,其他都是重複程式碼
  13.      }
  14.     })
  15.    
  16.     //以下是Scala實現方式,他讓我們只關注核心處理邏輯,去掉不相關操作,如建立匿名內部類,實現方法等
  17.     //定義一個隱式轉換
  18.     implicit def convertedAction(action: (ActionEvent) => Unit) =
  19.      new ActionListener {
  20.      override def actionPerformed(event: ActionEvent) { action(event) } //action就是下面的函式本身
  21.     }
  22.    
  23.     //核心邏輯處理,只關心data += 1,以及println
  24.     jButton.addActionListener((event: ActionEvent) => {data += 1; println(data)})
  25.     
  26.     frame.setContentPane(jButton);
  27.     frame.pack();
  28.     frame.setVisible(true);
  29.   }

  30. }


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28912557/viewspace-1850583/,如需轉載,請註明出處,否則將追究法律責任。

相關文章