lambda是java8版本的新特性,其主要针对于函数式接口(就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口)
函数式语言提供了一种强大的功能——闭包(函数中,能访问函数外的变量,并且函数外的变量值改变后,会影响函数内的计算)
相比于传统的编程方法有很多优势,闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。Java 现在提供的最接近闭包的概念便是 Lambda 表达式,虽然闭包与 Lambda 表达式之间存在显著差别,但至少 Lambda 表达式是闭包很好的替代者。
如果对自己编写的函数式接口判断不出错误,可以添加**@FunctionalInterface 注解**,帮助判断是否是函数式接口.
1.参数类型可以省略,当出现多个参数时,如果省略必须全部省略
2.若只有一个参数,可以省略()
3.方法体中只有一条语句,可以省略{}
4.如果方法体中,唯一一条语句是return 可以省略return关键字
它的作用是将一个lambda表达式指向一个已经实现的方法,下面我们举例说明一下
public class FLambda { public static void main(String[] args) { functionlambda n1 = a -> change(a); System.out.println(change(7)); } public static int change(int a ) { return a*2; } } interface functionlambda { void show(int a); }上面的lambda方法体中引用了change方法.
1.静态方法引用
语法: 类名**:?*静态方法
与静态方法调用.作用相同,但是要注意一点 change(),show()两者之间的参数类型,参数数量,返回值类型必须保持一致
public class FLambda { public static void main(String[] args) { functionlambda n1 = FLambda::change; System.out.println(n1.show()); } public static int change() { return 5; } } interface functionlambda { int show(); }2.非静态方法
语法: 对象名::非静态方法
public class FLambda { public static void main(String[] args) { functionlambda n1 =fflambda::doshow; System.out.println(n1.show(1));//这个传任意参数,都是打印777 因为方法引用 返回777 } } interface functionlambda { int show(int a); } class fflambda{ public static int doshow(int a ) { return 777; } }3.构造方法
语法: 对象名::new
用法与上面的都是相同的,只是关键字需要用new,在此不进行举例说明了.
1.用于集合排序,将persion对象按着年龄升序
public class text { public static void main(String[] args) { ArrayList<persion> a = new ArrayList<>(); Collections.addAll(a, new persion("小明", 17), new persion("小王", 11), new persion("小李", 19), new persion("小刘", 10)); a.sort((o1, o2) -> o1.age - o2.age); System.out.println(a); } }2.用于TreeSet自定义排序(1.在persion中实现Comparable接口, 2.通过外部比较器Compator来进行自定义),在没有指定规则对set对象进行排序,程序运行会出现异常
public class text01 { public static void main(String[] args) { TreeSet<persion> a = new TreeSet<>((o1, o2) -> o1.age - o2.age); Collections.addAll(a, new persion("小明", 17), new persion("小王", 11), new persion("小李", 19), new persion("小刘", 10)); System.out.println(a); } }