美文网首页
Scala的ACM转换

Scala的ACM转换

作者: 田真的架构人生 | 来源:发表于2017-08-01 09:28 被阅读0次

    SAM-single abstract method
    在Scala中,要某个函数做某件事时,会传一个函数参数给它。而在Java中,并不支持传送参数。
    通常Java的实现方式是将动作放在一个实现某接口的类中,然后将该类的一个实例传递给另一个方法。
    很多时候,这些接口只有单个抽象方法(single abstract method),在Java中被称为SAM类型。

    object SAM {
    
      def main(args: Array[String]){
        
        var data = 0
        val frame = new JFrame("SAM Testing");
        val jButton = new JButton("Counter")
       
        //这是java实现方式
        jButton.addActionListener(new ActionListener {
         override def actionPerformed(event: ActionEvent) {
         data += 1
         println(data) //其实这两行才是核心处理逻辑,其他都是重复代码
         }
        })
        
        //以下是Scala实现方式,他让我们只关注核心处理逻辑,去掉不相关操作,如创建匿名内部类,实现方法等
        //定义一个隐式转换
        implicit def convertedAction(action: (ActionEvent) => Unit) = 
         new ActionListener {
         override def actionPerformed(event: ActionEvent) { action(event) } //action就是下面的函数本身
        }
        
        //核心逻辑处理,只关心data += 1,以及println
        jButton.addActionListener((event: ActionEvent) => {data += 1; println(data)})
         
        frame.setContentPane(jButton); 
        frame.pack(); 
        frame.setVisible(true); 
      }
    }
    

    相关文章

      网友评论

          本文标题:Scala的ACM转换

          本文链接:https://www.haomeiwen.com/subject/dyodlxtx.html