scala基础27-SAM转换

这篇博客探讨了在Scala中如何使用SAM(Single Abstract Method)转换来简化与Java接口的交互。通过一个例子展示了如何在Scala中避免创建单独的ActionListener类,而是直接使用匿名函数进行事件处理,从而提高代码的简洁性。
摘要由CSDN通过智能技术生成
import javax.swing.JButton
import java.awt.event.ActionListener
import java.awt.event.ActionEvent
import javax.swing.JFrame

object Test {

  /**
    * 在Scala中,要某个函数做某件事时,会传一个函数参数给它。
    * 而在Java中,并不支持传送参数。通常Java的实现方式是将动作放在一个实现某接口的类中,
    * 然后将该类的一个实例传递给另一个方法。很多时候,这些接口只有单个抽象方法(single abstract method),
    * 在Java中被称为SAM类型。
    * @param args
    */
  def main(args: Array[String]): Unit = {
    var count = 0


    val frame = new JFrame("SAM Testing")
    val button = new JButton("Increment")
    //java方式
//    button.addActionListener(new ActionListener {
//      override def actionPerformed(event: ActionEvent) {
//        count += 1
//        println(count)
//      }
//    })

    /**
      * scala方式: 隐式转换,将一种类型自动转换成另外一种类型,是个函数。
      * 因为在Scala中,函数是头等公民,所以隐式转换的作用也大大放大了。
      * 将这个函数和界面代码放在一起,就可以在所有预期ActionListener对象的地方,传入(ActionEvent)=>Unit函数参数。
      * @param action
      * @return
      */
    implicit def makeAction(action: (ActionEvent) => Unit) =
      new ActionListener {
        override def actionPerformed(event: ActionEvent) { action(event) }
      }

    button.addActionListener((event: ActionEvent) => {count += 1; println(count)})

    frame.setContentPane(button)
    frame.pack()
    frame.setVisible(true)
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值