lamdba表达式
Posted yangfei629
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lamdba表达式相关的知识,希望对你有一定的参考价值。
1、lamdba有何用
java8出现了lamdba表达式,类似js的箭头函数。有何用?
看个例子 java8之前 一个List的排序,如下的写法是使用匿名类来实现Compartor接口
public static void main(String[] args) List<String> strList = Arrays.asList("yf1","yf2"); strList.sort(new Comparator<String>() @Override public int compare(String o1, String o2) return o1.compareTo(o2); );
lamdba出现后 ,可以改成如下形式
public static void main(String[] args) List<String> strList = Arrays.asList("yf1","yf2"); strList.sort((o1, o2) -> o1.compareTo(o2));
是否很简洁 可读性跟好。
2、如何使用lamdba表达式
基本语法,如下
param -> expression
(param1,param2) -> expression
(type param1,type param2) -> expression
(param1,param2) -> statements;...
特点:
a. 省略了接口名称,方法。
b. 参数类型也不是必须的,可以省略
c. 单个语句可以省略
d. 方法体内容,一般不建议有多行,3行以内
其中b c缺省的类型 java会在编译时 进行类型推断,根据上下文信息自动识别其类型
(java是强类型语言)
3、函数式接口
函数式接口 : 只有一个抽象方法的接口
只有函数式接口才可以使用lamdba表达式。
注意java8 可以定义有默认实现的方法,这个跟lamdba不冲突,看如下例子
定义函数式接口:
@FunctionalInterface public interface LamInterface void print(String name); default String getName() return "yf";
测试:
public class LamdbaYf public static void testLamdbs(LamInterface lamInterface) lamInterface.print(lamInterface.getName()); public static void main(String[] args) testLamdbs((name)->System.out.println("my name is = "+name));
输出:my name is = yf
4、@FunctionalInterface注解
这个注解标识此接口是函数式接口,如果不是,如定义了2个抽象方法。编译会提示报错的
但不是说函数式接口必须使用此注解,即使不使用@FunctionalInterface注解,功能依然不受影响。
5、lamdba表达式与匿名类区别
1、this的使用
匿名类实际还是一个类,在匿名类中使用this 表示的是这个匿名类实例本身。
而在lamdba中使用this ,是指调用lamdba的类实例
2、lamdba是通过invokedynamic jvm虚拟机指令执行的
6、方法引用
TODO
以上是关于lamdba表达式的主要内容,如果未能解决你的问题,请参考以下文章