Java8中引入了一个新的操作符 “->” 该操作符称为箭头操作符或 Lambda 操作符箭头操作符将 Lambda 表达式拆分成两部分:
左侧:Lambda 表达式的参数列表;
右侧:Lambda 表达式中所需执行的功能, 即 Lambda 体。
下面以一个简单实例看
首先建一个接口类Info:
public interface Info {
public void show();
}
以前都是创建一个类,实现Info接口,并重写show方法,
public class MyInfo implements Info {
@Override
public void show() {
System.out.println("The interface is Info");
}
}
调用的时候如下
public static void main(String[] args) {
MyInfo myInfo = new MyInfo();
myInfo.show();
}
现在我们用Lambda表达式实现
public static void main(String[] args) {
Info info = ()->System.out.println("The interface is Info");
info.show();
}
用Lambda表达式实现了Info接口中的show方法,Info info = ()->System.out.println("The interface is Info");
其中()表示show方法传入的参数为空,System.out.println(“The interface is Info”)表示实现show方法的方法体;info 为实现接口的对象。
下面展示Lambda接口表达式的几种形式
一、接口方法中无参数,无返回值
同上述示例所示。
二、接口方法中有一个参数,无返回值
例如Info1接口中有一个show方法,方法中只有一个参数
public interface Info1 {
void show(String name);
}
用Lambda表达式实现
public static void main(String[] args) {
/*x表示接口方法中传入一个参数,类型会自动推断;
System.out.println("The interface is " + x)为接口方法show的实现体;
表示创建了一个对象info1,改对象实现了Info1接口,用实现了接口中的show方法;
只有一个参数时,(x)的括号可以省略,直接写x*/
Info1 info1 = (x)->System.out.println("The interface is " + x);
/*通过创建的info1对象直接调用方法,用法同调用普通的类相同*/
info1.show("Info1");
}
运行输出结果:
The interface is Info1
三、接口方法中有多个参数,有返回值
public interface Person {
Boolean show(String name, int age);
}
假设有一个接口类Person,接口方法中传入姓名和年龄两个参数,下面通过Lambda表达式实现如果某人的年龄小于25岁,表示是一个学生,返回true;如果某人年龄大于25岁,表示是工作者,返回false。
public static void main(String[] args) {
/*(x, y)为覆写接口方法show传入的参数;
{}中方法体为覆写show方法的方法体;
person为实现接口Person方法创建的对象*/
Person person = (x, y) -> {
if (y < 25) {
System.out.println(x + " is a student");
return true;
}else {
System.out.println(x + " is a worker");
return false;
}
};
person.show("lzj", 27);
person.show("Jenken", 20);
}
运行,输出结果:
lzj is a worker
Jenken is a student
注意:若方法体中只有一条语句,{ }和 return都可以省略不写。
注意:上面Person person = (x, y) -> { ……
实质为Person person = (String x, int y) -> {
,只是由于x和y的类型可以自动推断出,所以一般用的时候不写类型。
四、有些JDK内部的接口可以用Lambda表达式实现
我们在使用多线程的时候,需要创建线程,例如
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("Hello World!" + "This is a Thread!");
}
};
r.run();
用Lambda表达式实现,就等价于
Runnable r = () -> System.out.println("Hello World!" + "This is a Thread!");
r.run();