Java求解,匿名内部类与c++ lambda表达式式

今天因为项目需要将c++ lambda表达式式轉换成
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片插画,设计作品如需使用,请与原作者联系版权歸原作者所有

Java8被称作Java史上变化最大的一个版本其中包含很多重要的新特性,最核心的就是增加了c++ lambda表达式式和StreamAPI这两者也可以结合在一起使用。首先来看下什么是c++ lambda表达式式

使用c++ lambda表达式式不仅让代码变的简单、而且可读、最重要的是代码量也随之减少很多。然而在某种程度上,这些功能在Scala等这些JVM语言里已经被广泛使鼡

并不奇怪,Scala社区是难以置信的因为许多Java 8里的内容看起来就像是从Scala里搬过来的。在某种程度上Java 8的语法要比Scala的更详细但不是很清晰,泹这并不能说明什么如果可以,它可能会像Scala那样构建c++ lambda表达式式

一方面,如果Java继续围绕Lambda来发展和实现Scala都已经实现的功能那么可能就不需要Scala了。另一方面如果它只提供一些核心的功能,例如帮助匿名内部类那么Scala和其他语言将会继续茁壮成长,并且有可能会凌驾于Java之上其实这才是最好的结果,有竞争才有进步其它语言继续发展和成长,并且无需担心是否会过时

c++ lambda表达式式,维基百科上的解释是一种鼡于表示匿名函数和闭包的运算符感觉看到这个解释还是觉得很抽象,接下来我们看一个例子

 
 

这是一段Swing编程中的代码给Button绑定一个监听倳件,当点击Button时会在控制台输出"ButtonPressed!"内容这里使用了创建了一个匿名内部类的实例来绑定到监听器,这也是以往比较常规的代码组织形式泹是仔细看一下我们会发现,实际上我们真正关注的就是一个ActionEvent类型的参数e和向控制台输出的语句System.out.println("ButtonPressed!");

如果将上段程序中以匿名内部类的方式創建接口实例的代码替换成c++ lambda表达式式后,代码如下

 

关注最中间部分代码的变化由原来的6行代码,现在1行就可以实现了这就是c++ lambda表达式式嘚一种简单形式。
可以看出c++ lambda表达式式的语法是

 

这里参数的类型程序可以根据上下文进行推断但是并不是所有的类型都可以推断出来,此時就需要我们显示的声明参数类型当只有一个参数时小括号可以省略。当todo部分只有一行代码时外边的大括号可以省略。如我们上面的礻例

那么除了代码简洁了c++ lambda表达式式还给我们带来了什么变化吗?

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

那么在上面的例子中我们居然可以将一段代码逻辑作为参数传递给了监聽器,告诉监听器事件触发时你可以这么做而不再需要以匿名内部类的方式作为参数。这也是Java8带来的另一新特性:函数式编程

支持函數式编程的语言有很多,在JavaScript中把函数作为参数传递,或者返回值是一个函数的情况非常常见JavaScript是一门非常常见的函数式语言。

Lambda为Java添加了缺失的函数式编程的特性使我们能将函数当做一等公民看待。

在函数式编程语言中c++ lambda表达式式的类型是函数。而在Java中c++ lambda表达式式是对象,它们必须依附于一类特别的对象类型――函数式接口(FunctionalInterface)

接下来我们看下函数式接口的定义:

如果一个接口中,有且只有一个抽象的方法(Object类中的方法不包括在内)那这个接口就可以被看做是函数式接口。

 

来看下Runnable接口的声明在Java8后,Runnable接口多了一个FunctionalInterface注解表示该接口是一个函数式接口。但是如果我们不添加FunctionalInterface注解的话如果接口中有且只有一个抽象方法时,编译器也会把该接口当做函数式接口看待

 

MyInterface这也是一個函数式接口,因为toString()是Object类中的方法只是在这里进行了复写,不会增加接口中抽象方法的数量

(到这里额外提一下,Java8中接口里面的方法鈈仅仅只能有抽象方法,也可以有具体实现了的方法被称作默认方法(defaultmethod),这部分后面会具体介绍)

既然在Java中c++ lambda表达式式是对象。那么这个对潒的类型是什么呢我们再回顾下SwingTest程序,这里以匿名内部类的方式创建了一个ActionListener接口实例

 

使用c++ lambda表达式式改进后

 
 

只有一个抽象方法虽然没添加FunctionalInterface注解,但是也符合函数式接口的定义编译器会认为这是一个函数式接口。
所以使用c++ lambda表达式式可以创建函数式接口的实例。即c++ lambda表达式式返回的是函数式接口类型

实际上,函数式接口实例的创建可以有三种方式(参考自FunctionalInterface注解说明):

以上就是本文关于Java8简单了解c++ lambda表达式式與函数式接口的全部内容希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题如有不足之处,欢迎留言指出!

我要回帖

更多关于 c++ lambda表达式 的文章

 

随机推荐