转载

Java新特性之函数式接口

什么是函数式接口

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

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

为什么要函数式接口

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

怎么样使用函数式接口

Service.java

@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

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

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 新特性

Java 8新特性终极指南
原文  https://www.huangdayu.cn/2019/04/10/Java新特性之函数式接口/
正文到此结束
Loading...