一起来学Java8(二)——Lambda表达式

原创
2019/10/21 12:24
阅读数 687

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表达式的基本用法,以及在函数式接口中的使用方式。

定期分享技术干货,一起学习,一起进步!

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
1 收藏
0
分享
返回顶部
顶部