lambda是java8版本的新特性,其主要针对于函数式接口(就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口)
函数式语言提供了一种强大的功能——闭包(函数中,能访问函数外的变量,并且函数外的变量值改变后,会影响函数内的计算)
相比于传统的编程方法有很多优势,闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。Java 现在提供的最接近闭包的概念便是 Lambda 表达式,虽然闭包与 Lambda 表达式之间存在显著差别,但至少 Lambda 表达式是闭包很好的替代者。
()->{}
()里面存放的是参数
{}重写抽象方法具体逻辑
->执行方法体
public class FLambda {
public static void main(String[] args) {
functionlambda n1 = ()->{
System.out.println("无参无返回值");
};
n1.show();
}
}
interface functionlambda {
void show();
}
public class FLambda {
public static void main(String[] args) {
functionlambda n1 = () -> {
return 5;
};
System.out.println(n1.show());
}
}
interface functionlambda {
int show();
}
public class FLambda {
public static void main(String[] args) {
functionlambda n1 = (a) -> {
return 5+a;
};
System.out.println(n1.show(5));
}
}
interface functionlambda {
int show(int a );
}
public class FLambda {
public static void main(String[] args) {
functionlambda n1 = (a,b) -> {
return b+a;
};
System.out.println(n1.show(5,6));
}
}
interface functionlambda {
int show(int a,int b );
}
public class FLambda {
public static void main(String[] args) {
functionlambda n1 = (a) -> {
System.out.println(a);
};
n1.show(10);
}
}
interface functionlambda {
void show(int a);
}
public class FLambda {
public static void main(String[] args) {
functionlambda n1 = (a,b) -> {
System.out.println(a+b);
};
n1.show(7, 3);
}
}
interface functionlambda {
void show(int a,int b );
}
如果对自己编写的函数式接口判断不出错误,可以添加**@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);
}
}