什么是Lambda表达式,简单的说是一种匿名函数表达方式。所以Lambda表达式本质是个函数,只不过没有函数名称。java
Lambda表达式具备如下特色:ide
Lambda的基本语法是:函数
(参数列表) -> 表达式
学习
或this
(参数列表) -> { 表达式; }
code
有函数式接口的地方就可使用Lambda表达式。接口
函数式接口的定义:一个接口里面只有一个抽象方法。
字符串
拿Runnable接口来讲,它是一个函数式接口,Runnable用法以下代码所示:get
Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("run..."); } }); thread.start(); Thread.sleep(100);
因为Runnable是个函数式接口,所以可使用Lambda表示替换,替换后以下:it
// 方式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表达式的基本用法,以及在函数式接口中的使用方式。
按期分享技术干货,一块儿学习,一块儿进步!