JDK8新特性-函数式接口和Lambda表达式
Posted IT技术和互联网资讯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDK8新特性-函数式接口和Lambda表达式相关的知识,希望对你有一定的参考价值。
以前看到过很多介绍JDK8新特性中的函数式接口和lambda表达式,但是始终理解的不是很到位,今天重新捋一下思路,写一下自己的理解。
一、函数式接口:
函数式接口其实本质上还是一个接口,但是它是一种特殊的接口,就是有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。即SAM类型的接口(Single Abstract Method)。定义了这种类型的接口,可以在调用以其为形参的方法时,使用一个lambda表达式作为实参。从另一个方面说,一旦我们调用某方法,可以传入lambda表达式作为参数,则这个方法的参数类型,必定是一个函数式的接口。例如Thread类接收一个Runnable类型的参数
JDK 1.8之前已有的函数式接口:
java.lang.Runnable
java.util.concurrent.Callable
java.security.PrivilegedAction
java.util.Comparator
java.io.FileFilter
java.nio.file.PathMatcher
java.lang.reflect.InvocationHandler
java.beans.PropertyChangeListener
java.awt.event.ActionListener
javax.swing.event.ChangeListener
JDK 1.8 新增加了函数接口包:java.util.function
我们也可以自定函数式接口,例如
public interface Flyable{
void fly(String able);
}
二、Lambda 表达式
Lambda表达式可以看成是匿名内部类,使用Lambda表达式时,接口必须是函数式接口。
基本语法:
<函数式接口> <变量名> = (参数1,参数2...) -> {
//方法体
}
说明:
(参数1,参数2…)表示参数列表;->表示连接符;{}内部是方法体
1、=右边的类型会根据左边的函数式接口类型自动推断;
2、如果形参列表为空,只需保留();
3、如果形参只有1个,()可以省略,只需要参数的名称即可;
4、如果执行语句只有1句,且无返回值,{}可以省略,若有返回值,则若想省去{},则必须同时省略return,且执行语句也保证只有1句;
5、形参列表的数据类型会自动推断;
6、lambda不会生成一个单独的内部类文件;
7、lambda表达式若访问了局部变量,则局部变量必须是final的,若是局部变量没有加final关键字,系统会自动添加。
使用如下:
Thread t = new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("hello " + i);
}
});
t.start();
Flyable f = s->System.out.println(s);
f.fly("翅膀");
以上是关于JDK8新特性-函数式接口和Lambda表达式的主要内容,如果未能解决你的问题,请参考以下文章
吊打面试官@@@Java中jdk8新特性--Lambda表达式函数式接口Stream API