第24讲: Scala中SAM转换实战详解

SAM 是single  abstract method的缩写,就是一些接口只有单个抽象方法

假设我们需要做一个按钮,每当按下按钮时,后台记录一次点击次数。在Java中代码实现的方式如下:

package com.dt.scala.func
import javax.swing.JButton
import java.awt.event.ActionListener
import java.awt.event.ActionEvent
import javax.swing.JFrame

object SAM {
  def main(args: Array[String]): Unit = {
    var data = 0
    val frame = new JFrame("SAM Testing");
	  val jButton = new JButton("Counter")
	  jButton.addActionListener(new ActionListener {
	    override def actionPerformed(event: ActionEvent) {
	      data += 1
	      println(data)
	    }
	  })   
    frame.setContentPane(jButton);   
    frame.pack();  
    frame.setVisible(true);  

  }
}

jButtton.addActionListener 中的代码,我们只关心

data += 1
println(data)

其他的都是样板代码,每次都要重复的写。在scala中,我们可以使用隐式转换,简化写法。如下

package com.dt.scala.func
import javax.swing.JButton
import java.awt.event.ActionListener
import java.awt.event.ActionEvent
import javax.swing.JFrame

object SAM {
  def main(args: Array[String]): Unit = {
    var data = 0
    val frame = new JFrame("SAM Testing");
    val jButton = new JButton("Counter")
    implicit def convertedAction(action: (ActionEvent) => Unit) = 
       new ActionListener {
	  override def actionPerformed(event: ActionEvent) { action(event) }
    }
    
    jButton.addActionListener((event: ActionEvent) => {data += 1; println(data)})

    frame.setContentPane(jButton);   
    frame.pack();  
    frame.setVisible(true);  

  }
}

我们的功能代码被简化成

 jButton.addActionListener((event: ActionEvent) => {data += 1; println(data)})

这种功能就叫SAM转换。

时间: 2024-10-10 14:52:16

第24讲: Scala中SAM转换实战详解的相关文章

DT梦工厂 第24讲 scala中sam转换实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/dHz5JKJxurM/优酷:http://v.youku.com/v_show/id_

Scala中SAM转换实战详解之Scala学习笔记-15

package com.leegh.function import javax.swing.JFrameimport javax.swing.JButtonimport java.awt.event.ActionListenerimport java.awt.event.ActionEvent /** * @author Guohui Li */object SAM_Curring { def main(args: Array[String]): Unit = { var data = 0; v

Scala 深入浅出实战经典 第53讲:Scala中结构类型实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/pR_4sY0cJLs/优酷:http://v.youku.com/v_show/id_

Scala 深入浅出实战经典 第57讲:Scala中Dependency Injection实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/5LnLNDBKvi8/优酷:http://v.youku.com/v_show/id_

Scala 深入浅出实战经典 第54讲:Scala中复合类型实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/a6qIB7SqOlc/优酷:http://v.youku.com/v_show/id_

第58讲:Scala中Abstract Types实战详解

package com.parllay.scala.type_parameterizitor import scala.io.{Source, BufferedSource} /** * Created by richard on 15-8-17. * 第58讲:Scala中Abstract Types实战详解 */ /** * scala里的类型,除了在定义class,trait,object时会产生类型, * 还可以通过type关键字来声明类型. type相当于声明一个类型别名: scala

Scala 深入浅出实战经典 第55讲:Scala中Infix Type实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/9JKSqMiQuBE/优酷:http://v.youku.com/v_show/id

Scala 深入浅出实战经典 第58讲:Scala中Abstract Types实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/IVN4EuFlmKk/优酷:http://v.youku.com/v_show/id

第23讲: Scala高阶函数实战详解

高阶函数主要有两种: 一.将一个函数当做另外一个函数的参数(即函数参数) 普通函数的定义语法如下: def funName(para1:Type1,para2:Type2):Type = { do some things } 我们想象一下,如果将函数作为参数,那么函数的类型该怎么写呢? 函数的类型,其实就是输入输出的类型. 假设,我们需要将函数ceil作为参数,而ceil的定义如下   def ceil(x: Double): Double  = java.lang.Math.ceil(x) 那