大数据系列修炼-Scala课程24(2)

大数据系列修炼-Scala课程24(2)

核心内容:
1、scala中的SAM转换机制

1、Scala中SAM的概念、SAM的执行方式

1>在scala中,要某个函数做某件事时,会传一个函数参数给它。而在Java中,并不支持传送函数作为参数。通常Java的实现方式是将
动作放在一个实现某接口的类中,然后将该类的一个实例传递给另一个方法。很多时候,这些接口只有单个
抽象方法(Single abstract method),在Java中的这些方法被称为SAM类型
2>在隐式转换机制中,(传送的)函数参数的类型必须和动作函数中的参数类型保持一致
3>利用SAM转换机制,可以将Java中的样本代码转换为专注于函数本身的实现逻辑

实例程序(无SAM转换机制):

object App6 
{
   var data1 = 0
   var data2 = 0
   def main(args:Array[String]):Unit=
   { 
      var f = new Frame("数据分析玩家")
      f.setBounds(100, 100, 200, 200)
      f.setLayout(new GridLayout(2,1))
      var button1 = new Button("data1")
      button1.setBackground(Color.yellow)
      button1.addActionListener(
      new ActionListener()  //创建匿名类之实现接口
      {
        def actionPerformed(e:ActionEvent)=  //动作函数
        {
           data1 += 1
           println("data1="+data1)
        }
      })
      var button2 = new Button("data2")
      button2.addActionListener(
      new ActionListener()  //创建匿名类之实现接口
      {
        def actionPerformed(e:ActionEvent)=  //动作函数
        {
           data2 += 1
           println("data2="+data2)
        }
      })
      button2.setBackground(Color.BLUE)
      f.add(button1)
      f.add(button2)
      f.setVisible(true) 
   }
}

实例程序(有SAM转换机制):

object App6 
{
   var data1 = 0
   var data2 = 0
   def main(args:Array[String]):Unit=
   { 
      var f = new Frame("数据分析玩家")
      f.setBounds(100, 100, 200, 200)
      f.setLayout(new GridLayout(2,1))
      var button1 = new Button("data1")
      button1.setBackground(Color.yellow)
      /***************Scala中的SAM转换**************8*/
      implicit def convertAction(f:(ActionEvent)=>Unit)=    //&1
      {
         new ActionListener()
         {
           def actionPerformed(e:ActionEvent)=  //动作函数 &2
           {
               f(e)  //e相当于action
           }
         }
      }
      /***************Scala中的SAM转换**************8*/
      button1.addActionListener((action:ActionEvent)=>{data1+=1;println("data1=:"+data1)})  //&3
      var button2 = new Button("data2")
      button2.addActionListener((action:ActionEvent)=>{data2+=1;println("data2=:"+data2)})  //&4
      button2.setBackground(Color.BLUE)
      f.add(button1)
      f.add(button2)
      f.setVisible(true) 
   }

注意:1、2、3、4处函数参数的类型必须保持一致,这是隐式转换的关键!

你可能感兴趣的:(scala,大数据)