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表达式的主要内容,如果未能解决你的问题,请参考以下文章

《JDK8新特性专题》-03函数式接口

JDK8新特性

吊打面试官@@@Java中jdk8新特性--Lambda表达式函数式接口Stream API

Java新特性解读JDK8之函数式接口Function

JDK8新特性02 Lambda表达式02_Lambda语法规则

JDK8 新特性