lambda表达式只针对有什么的接口实现,lambda表达式的使用

  lambda表达式只针对有什么的接口实现,lambda表达式的使用

  Java8被称为Java历史上变化最大的版本。它包含了很多重要的新特性,核心是增加了Lambda表达式和Stream API。两者也可以结合使用。【推荐学习:java视频教程】

  如何解决写爬虫IP受阻的问题?立即使用。

  我们先来看什么是Lambda表达式。

  Lambda expression,维基百科的解释是用来表示匿名函数和闭包的运算符。看到这个解释感觉很抽象。接下来,我们来看一个例子。

  公共类摇摆测试{

  公共静态void main(String[] args) {

  JFrame jFrame=new JFrame(我的JFrame );

  JButton jButton=new JButton(我的JButton );

  jbutton . addactionlistener(new action listener(){

  @覆盖

  public void action performed(action event e){

  按钮已按下!);

  }

  });

  jframe . add(jButton);jframe . pack();

  jframe . set visible(true);

  JFrame . setdefaultcloseoperation(JFrame。EXIT _ ON _ CLOSE);

  }

  }这是Swing编程中的一段代码,将一个监听事件绑定到按钮上,当按钮被点击时,会输出‘按钮已按下!’在控制台里。内容。这里创建一个匿名的内部类实例来绑定监听器,这也是过去惯用的代码组织形式。但如果我们仔细观察,会发现我们真正关心的是一个ActionEvent类型参数E和语句system . out . println( button pressed!)输出到控制台。);

  如果将前面程序中匿名内部类创建接口实例的代码替换为Lambda表达式,代码如下

  公共类摇摆测试{

  公共静态void main(String[] args) {

  JFrame jFrame=new JFrame(我的JFrame );

  JButton jButton=new JButton(我的JButton );

  j Button . addactionlistener(e-system . out . println(按钮已按下!));

  jframe . add(jButton);

  jframe . pack();

  jframe . set visible(true);

  JFrame . setdefaultcloseoperation(JFrame。EXIT _ ON _ CLOSE);

  }}

  注意中间部分代码的变化。从原来的六行代码,到现在一行就能实现。这是Lambda表达式的简单形式。

  可以看出,Lambda表达式的语法是

  (参数1,参数2,参数3) - {

  //todo}

  这里的参数类型可以从上下文中推断出来,但不是所有的类型都可以推断出来。这时,我们需要显示声明的参数类型。当只有一个参数时,括号可以省略。当todo部分只有一行代码时,可以省略外面的花括号。正如我们上面的例子

  那么除了简洁的代码,Lambda expression给我们带来了什么改变吗?

  我们回想一下,在Java中,是否不能将函数作为参数传递给方法,也不能声明返回值为函数的方法。在Java8之前,答案是肯定的。

  因此,在上面的例子中,我们实际上可以将一段代码逻辑作为参数传递给侦听器,告诉侦听器当事件被触发时,您可以这样做,而不是使用匿名内部类作为参数。这是Java8带来的另一个新特性:函数式编程。

  有许多语言支持函数式编程。在JavaScript中,将函数作为参数传递是非常常见的,或者返回值是函数。JavaScript是一种非常常见的函数式语言。

  Lambda为Java添加了函数式编程所缺少的特性,这使我们能够将函数视为一等公民。

  在函数式编程语言中,Lambda表达式的类型是函数。而在Java中,Lambda表达式是对象,它们必须依附于一类特别的对象类型——函数式接口(Functional Interface)

  接下来,让我们看看功能接口的定义:

  如果一个接口中只有一个抽象方法(不包括Object类中的方法),那么这个接口可以看作是一个函数接口。

  @功能界面

  公共接口可运行{

  /**

  *当使用实现接口codeRunnable/code的对象时

  *要创建线程,启动线程会导致对象的

  * coderun/code方法将在单独执行

  *线程。

  * p

  *方法coderun/code的一般约定是它可以

  *采取任何行动。

  *

  * @see java.lang.Thread#run()

  */

  公共抽象void run();

  }我们来看看Runnable接口的说法。在Java8之后,Runnable接口有了FunctionalInterface注释,表示该接口是一个函数接口。但是如果我们不添加FunctionalInterface注释,如果接口中只有一个抽象方法,编译器就会把接口当作函数接口。

  @功能界面

  公共接口MyInterface {

  void test();

  string toString();

  }MyInterface这也是一个函数接口,因为toString()是Object类中的一个方法,但是这里是重复的,不会增加接口中抽象方法的数量。

  (这里我提一下,在Java8中,接口中的方法不仅可以有抽象的方法,也可以有具体实现的方法,称为默认方法,后面会详细介绍。)

  因为Lambda表达式是Java中的对象。那么这个物体的类型是什么呢?让我们回顾一下SwingTest程序,其中ActionListener接口的一个实例被创建为一个匿名内部类。

  jbutton . addactionlistener(new action listener(){

  @覆盖

  public void action performed(action event e){

  按钮已按下!);

  }

  });通过使用Lambda表达式进行改进

  j Button . addactionlistener(e-system . out . println(按钮已按下!));也就是我们用Lambda表达式创建一个ActionListener接口的实例,然后看ActionListener接口的定义。

  公共接口ActionListener扩展EventListener {

  /**

  *当动作发生时调用。

  */

  public void action performed(ActionEvent e);

  }只有一个抽象方法。虽然没有添加FunctionalInterface注释,但也符合函数接口的定义,编译器会认为是函数接口。

  因此,您可以使用Lambda表达式来创建函数接口的实例。也就是说,Lambda表达式返回一个函数接口类型。

  实际上,创建FunctionalInterface的实例有三种方法(参见functional interface的注释):

  1.表达式

  2.方法引用(后续章节介绍)

  3.施工方法参考(后续章节介绍)

  总结:在本文中,我们打开了学习Java8的大门,了解了什么是lambda表达式,理解了函数接口的定义,并用几个例子演示了lambda表达式的便利性。

  更多相关文章,请访问:java入门。以上是深入了解Lambda表达式和函数接口的细节。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: