标签:ram 基本 highlight new 输出 getname 语法 err 自动识别
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
标签:ram 基本 highlight new 输出 getname 语法 err 自动识别
原文地址:https://www.cnblogs.com/yangfei629/p/11421553.html