Java新特性之函数式接口

什么是函数式接口

  Functional Interface,顾名思义就是函数式接口。它有以下特征:

  • 一个有且仅有一个抽象方法。
  • @FunctionalInterface注解的接口声明是函数式接口,例如java.lang.Runnable,java.util.concurrent.Callable,java.util.function.*
  • 默认方法静态方法对函数式接口不影响。

为什么要函数式接口

  为了让现有的功能与Lmabdas表达式有很好的兼容,不受非抽象函数的影响,和将接口(匿名内部类)隐式转为Lambda表达式。例如java.lang.Runnable接口。

怎么样使用函数式接口

Service.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@FunctionalInterface
public interface Service {
	/***
	 * 抽象方法
	 */
	public abstract void create();
	
	/***
	 * 静态方法:必须有方法体,实现着可以覆盖
	 * @param pid
	 */
	public static void delete(int pid) {};
	
	/***
	 * 默认方法:必须有方法体,实现着可以覆盖
	 */
	public default void update() {};
	
	/**
	 * 默认方法:必须有方法体,实现着可以覆盖
	 * @param pid
	 */
	public default void get(int pid) {};
}

Server.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class Server implements Service {

	private Service service;

	public Server(Service service) {
		this.service = service;
	};

	public void start() {
		this.service.create();
	};

	public void restart() {
		if (service != null) {
			this.service.create();
		} else {
			this.service.create();
		}
	};

	public void update() {
		this.service.update();
	};

	public void stop(int pid) {
		Service.delete(pid);
	}

	@Override
	public void create() {
		if (service != null) {
			service.create();
		}
	};
}

Test.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Test {
	public static void main(String[] args) {
		// 使用函数接口的匿名内部类
		new Server(new Service() {
			@Override
			public void create() {
				System.out.println("start");
			}
		}).start();
		
		// 实际隐藏式转化为以下Lambda表达式
		new Server(() -> {
			System.out.println("restart");
		}).restart();
	}
}

参考文献

Java 8 新特性
Java 8新特性终极指南

今日诗词

作者信息