一、Lambda表达式
Lambda表达式时Java8重要的新特性。lambda允许把函数作为一个方法的参数。使用lambda可以是代码变得更加简洁紧凑,尤其在集合的遍历和其他集合操作中。
Lambda对接口的要求:
使用Lambda表达式可以对某些接口进行简单的实现,但不是所有的接口都可以使用Lambda表达式。
Lambda规定接口中只能有一个必须要被实现的方法,不是规定接口中只能有一个方法。
注意:jdk8中有另外一个新特性:default,被default修饰的方法会有默认实现,不是必须被实现的方法,所以不影响Lambda表达式的使用。
二、Lambda基础语法
语法形式为 ()->{} , 其中 () 用来描述参数列表;{} 用来描述方法体;-> 为lambda运算符,读作goes to。
三、Lambda语法简化
- 简化参数类型,参数类型可省略,但必须所有参数类型都不写
public interface TestInterface {
int add(int a, int b);
}
TestInterface ti = (int a, int b) -> a + b;//接收参数a和b,返回a+b
TestInterface ti = (a, b) -> a + b;
System.out.println(ti.add(2, 3));
- 简化参数小括号(),当只有一个参数式可以省略参数小括号
public interface TestInterface {
int add(int b);
}
TestInterface ti = (a) -> a + 1;//接收参数a,返回a+1
TestInterface ti = a -> a + 1;
System.out.println(ti.add(2));
- 简化方法体大括号{},当方法中只有一条语句式,可以省略方法体大括号
TestInterface ti = a -> {return a + 1;};
TestInterface ti = a -> a + 1;
- 如果方法体只有一条语句,并且式return语句时,可以省略方法体大括号
TestInterface ti = a -> {return a + 1;};
TestInterface ti = a -> a + 1;
四、Demo
1. 没有参数没有返回值
接口
//专门来修饰函数式接口,要求接口中的抽象方法只有一个。这个注解一般会和lambda表达式一起使用
@FunctionalInterface
public interface NoReturnNoPara {
void noReturnNoParaMethod();
}
普通写法:
public class Client {
public static void main(String[] args) {
Impl impl = new Impl();
impl.noReturnNoParaMethod();
}
}
class Impl implements NoReturnNoPara {
@Override
public void noReturnNoParaMethod() {
System.out.println("No Return No Parameter, normal...");
}
}
匿名内部类:
public class Client {
public static void main(String[] args) {
NoReturnNoPara noReturnNoPara = new NoReturnNoPara() {
@Override
public void noReturnNoParaMethod() {
System.out.println("No Return No Parameter, inner class...");
}
};
noReturnNoPara.noReturnNoParaMethod();
}
}
标准Lambda写法:
public class Client {
public static void main(String[] args) {
NoReturnNoPara noReturnNoPara = () -> {
System.out.println("No Return No Parameter, Lambda...");
};
noReturnNoPara.noReturnNoParaMethod();
}
}
简化Lambda写法
public class Client {
public static void main(String[] args) {
NoReturnNoPara noReturnNoPara = () -> System.out.println("No Return No Parameter, Lambda...");
noReturnNoPara.noReturnNoParaMethod();
}
}
- 一个参数,一个返回值
接口
@FunctionalInterface
public interface OneReturmOnePara {
int age(int bir);
}
普通实现
public class Client {
public static void main(String[] args) {
OneReturmOnePara onePara = new Impl();
System.out.println(onePara.age(1992));
}
}
class Impl implements OneReturmOnePara{
@Override
public int age(int bir) {
return 2020-bir;
}
}
匿名内部类
public class Client {
public static void main(String[] args) {
OneReturmOnePara onePara = new OneReturmOnePara() {
@Override
public int age(int bir) {
return 2020-bir;
}
};
System.out.println(onePara.age(1992));
}
}
普通Lambda:
public class Client {
public static void main(String[] args) {
OneReturmOnePara onePara = (int dir) -> {return 2020-dir;};
System.out.println(onePara.age(1992));
}
}
简化Lambda
public class Client {
public static void main(String[] args) {
OneReturmOnePara onePara = dir -> 2020-dir;
System.out.println(onePara.age(1992));
}
}
五、Funcational接口
其实我们不需要自己去创建接口OneReturmOnePara和NoReturnNoPara, Java8内部定义了一些函数式接口供我们使用,简单案例如下。详解参考另一篇博客Java8 Stream、函数式接口、方法引用(::)详解
public class Client {
public static void main(String[] args) {
Function<Integer, Integer> ti = a -> a + 1;
System.out.println(ti.apply(2));
}
}