Lambda简介
什么是Lambda表达式,简单的说是一种匿名函数表达方式。因此Lambda表达式本质是个函数,只不过没有函数名称。
Lambda表达式具有以下特点:
- 匿名,它没有函数名称
- 本质是个函数,除了函数名,它有参数列表、函数内容(方法体)、返回类型
- 简洁,有时候可以省略参数的类型
- 可传递,Lambda表达式可以当做一个变量进行存储
Lambda的基本语法是:
(参数列表) -> 表达式
或
(参数列表) -> { 表达式; }
哪里可以使用Lambda
有函数式接口的地方就可以使用Lambda表达式。
函数式接口的定义:一个接口里面只有一个抽象方法。
拿Runnable接口来说,它是一个函数式接口,Runnable用法如下代码所示:
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("run...");
}
});
thread.start();
Thread.sleep(100);
由于Runnable是个函数式接口,因此可以使用Lambda表示替换,替换后如下:
// 方式2
Thread thread2 = new Thread(() -> System.out.println("run2..."));
thread2.start();
Thread.sleep(100);
这里的Lambda表达式内容即为:() -> System.out.println("run2...")
,其中没有参数,没有返回值,只有一个方法体。这个表达式同样可以写成:
Thread thread2 = new Thread(() -> {
System.out.println("run2..."); // 注意这里;结尾
});
注意:加了花括号,方法体内部语句必须要有;结尾
还有一个函数式接口Callable,其内部的call方法需要返回一个值,Callable的使用方式如下代码所示:
ExecutorService excutorService = Executors.newSingleThreadExecutor();
Future<String> future = excutorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
return "Jim";
}
});
String name = future.get();
System.out.println(name);
使用Lambda表达式:
ExecutorService excutorService = Executors.newSingleThreadExecutor();
Future<String> future = excutorService.submit(() -> "Jim2");
String name = future.get();
System.out.println(name);
这里() -> "Jim2"
表示直接返回一个Jim2字符串,可以省略return
关键字。当然也可以写成:
excutorService.submit(() -> {
return "Jim2";
});
下面我们自定义一个函数式接口,然后使用Lambda表达式来书写。
package learn.java8.ch2;
// 函数式接口
@FunctionalInterface
interface Caller {
String call(String name);
}
class Serivce {
private String name;
public Serivce(String name) {
this.name = name;
}
public String run(Caller caller) {
return caller.call(name);
}
}
public class LambdaTest2 {
public static void main(String[] args) {
Serivce service = new Serivce("Jim");
String result = service.run((name) -> {
return "My name is " + name;
});
System.out.println(result);
}
}
此时Lambda表达式为:
(name) -> {
return "My name is " + name;
}
它具有参数列表、方法体、返回结果组成
注意:name实际类型被省略了,可以加上:
String result = service.run((String name) -> {
return "My name is " + name;
});
如果有多个参数,则写成:
(String a, String b) -> {}
或 (a, b) -> {}
Lambda表达式还可以当做变量进行存储,如下代码所示:
package learn.java8.ch2;
import java.util.function.Consumer;
public class LambdaTest3 {
static Consumer<String> consumer = (name) -> {
System.out.println("My name is " + name);
};
static class Service {
private String name;
public Service(String name) {
super();
this.name = name;
}
public void run(Consumer<String> consumer) {
consumer.accept(name);
}
}
public static void main(String[] args) {
// 可以直接调用
consumer.accept("Jim");
new Service("Tom").run(consumer);
}
}
在这个例子中直接使用Lambda表达式定义了一个接口实现:
static Consumer<String> consumer = (name) -> {
System.out.println("My name is " + name);
};
可以理解为将Lambda表达式赋给了consumer变量当中,也可以理解为直接实现了Consumer接口中的方法。
总之,只要有函数式接口的地方都可以使用Lambda表达式。
小结
本篇主要介绍了Lambda表达式的基本用法,以及在函数式接口中的使用方式。
定期分享技术干货,一起学习,一起进步!
网友评论