• 念念不忘,必有回响!包含: Java 基础, Java 部分源码, JVM, Spring, Spring Boot, Spring Cloud, 开源项目等
  • 念念不忘,必有回响!包含: 数据库原理, MySQL, ElasticSearch, MongoDB, Docker,CI&CD, Linux, DevOps, 分布式, 中间件等
  • 念念不忘,必有回响!包含: 开发工具, Git, IDE, 源码阅读,读书笔记等

函数式接口 Functional Interfaces

2023-04-15 11:13
1513
0

How does lambda expressions fit into Java's type system? Each lambda corresponds to a given type, specified by an interface. A so called functional interface must contain exactly one abstract method declaration. Each lambda expression of that type will be matched to this abstract method. Since default methods are not abstract you're free to add default methods to your functional interface.

通过上面的例子我们可以看到通过Lambda可以开发出同样功能的逻辑但是代码却很简单,那么Jvm是如何进行类型推断,并且找到对应的方法呢?

通过官文介绍以及我们使用发现,并不是每个接口都可以缩写成Lambda表达式的开发方式。其实是只有那些函数式接口(Functional Interface)才能缩写成 Lambda 表示式。

所谓函数式接口(Functional Interface)就是只包含一个抽象方法的声明。针对该接口类型的所有 Lambda 表达式都会与这个抽象方法匹配。{另外,只是在接口上添加default并不算抽象方法}

总结:为了保证一个接口明确的被定义为一个函数式接口(Functional Interface),我们需要为该接口添加注解:@FunctionalInterface。这样,一旦你添加了第二个抽象方法,编译器会立刻抛出错误提示。{不填写,但是只写一个default也可以}

定义含有注解@FunctionalInterface的接口

@FunctionalInterface
public interface IConverter<F, T> {
T convert(F from);

}

    @小傅哥: 代码已经复制到剪贴板

  1. 先来一段传统方式 & 简单易懂哈,因为看习惯了
IConverter<String, Integer> converter01 = new IConverter<String, Integer>() {
@Override
public Integer convert(String from) {
	return Integer.valueOf(from);
}
    @小傅哥: 代码已经复制到剪贴板

  1. 稍微简化下,化个妆 & (form),只有一个参数括号可以不要
IConverter<String, Integer> converter02 = (from) -> {
    return Integer.valueOf(from);
};
    @小傅哥: 代码已经复制到剪贴板

  1. 继续简化,因为他的实现只有一行代码,可以更加简短
IConverter<String, Integer> converter03 = from -> Integer.valueOf(from);
    @小傅哥: 代码已经复制到剪贴板

  1. 还能短点,其实这个另类属于下一段的内容了,先放这有个印象
IConverter<Integer, String> converter04 = String::valueOf;

全部评论