函数接口(Functional Interfaces)
定义
首先,我们先看看函数接口在《Java语言规范》中是怎么定义的:
函数接口是一种只有一个抽象方法(除Object中的方法之外)的接口,因此代表一种单一函数契约。函数接口的抽象方法可以是从超级接口继承而来,但继承而来的方法应该是覆写等效的( override-equivalent ),这种情况,在逻辑上,代表一个方法。
创建函数接口实例,除了以声明和实例化类的形式这种常规过程之外,还可以使用方法引用表达式和lambda表达式创建函数接口的实例。
声明函数接口时,除了要声明一个抽象方法,还可以声明覆写Object类中的public方法以及default方法。
以下举例说明:
示例一:最常见的函数接口形式
package org.springmorning.demo.javabase.annotation.pre; /**
* @author 春晨
* @date 2019/1/20 19:59
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10296022.html
*
* @Description 最常见的函数接口形式:只声明了一个抽象方法
*/ public interface Job {
void execute();
}
示例二:最常见的泛型函数接口形式
package org.springmorning.demo.javabase.annotation.pre; /**
* @author 春晨
* @date 2019/1/20 21:13
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10296022.html
*
* @Description 最常见的泛型函数接口形式:只声明了一个抽象方法
*/
public interface Work<T> {
T doWork(Object o);
}
示例三:只包含覆写Object的公共方法的接口,不属于函数接口
package org.springmorning.demo.javabase.annotation.pre; /**
* @author 春晨
* @date 2019/1/20 20:16
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10296022.html
*
* @Description 覆写Object的equals方法,不属于函数接口
*/
public interface NonFunctionInterface {
boolean equals(Object obj);
}
示例四:继承父接口的Object类的公共方法,自身声明了一个非Object类的公共方法,也属于函数接口
package org.springmorning.demo.javabase.annotation.pre; /**
* @author 春晨
* @date 2019/1/20 20:22
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10296022.html
*
* @Description 继承的父接口,虽然不是函数接口,但是此接口声明了抽象方法,此方法不属于Object类的public方法,因此属于函数接口
*/
public interface EquivalentInterface <T> extends NonFunctionInterface{
int compare(T o1, T o2);
}
示例五:包含覆写Object类公共方法的函数接口
/**
* @author 春晨
* @date 2019/1/20 20:24
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10296022.html
*
* @Description 包含覆写Object中equals方法的函数接口
*/
public interface EquivalentInterface <T> {
int compare(T o1, T o2); boolean equals(Object obj);
}
示例六:既包含覆写Object中equals方法,又包含default方法的函数接口
/**
* @author 春晨
* @date 2019/1/20 20:26
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10296022.html
*
* @Description 既包含覆写Object中equals方法,又包含default方法的函数接口
*/
public interface EquivalentInterface <T> {
int compare(T o1, T o2); boolean equals(Object obj); default String name(){
return "EquivalentInterface";
}
}
示例七:从父接口继承覆写等效方法的函数接口
package org.springmorning.demo.javabase.annotation.pre; /**
* @author 春晨
* @date 2019/1/20 20:36
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10296022.html
*
* @Description 函数接口的抽象方法可以是从X、Y两个父接口继承而来,但继承而来的valueOf方法是覆写等效,因此Z接口也属于函数接口
*/
interface X{
int valueOf(String x);
}
interface Y{
int valueOf(String y);
} public interface Z extends X, Y{
}
示例八:从父接口继承覆写等效方法的函数接口
package org.springmorning.demo.javabase.annotation.pre; /**
* @author 春晨
* @date 2019/1/20 20:41
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10296022.html
*
* @Description 函数接口的抽象方法可以是从A、B两个父接口继承而来,但继承而来的convert方法是覆写等效,因此C接口也属于函数接口
*/
interface A{
Iterable convert(Iterable<String> arg);
} interface B{
Iterable<String> convert(Iterable arg);
} public interface C extends A, B{
}
示例九:从父接口继承覆写等效方法的泛型函数接口
package org.springmorning.demo.javabase.annotation.pre; /**
* @author 春晨
* @date 2019/1/20 20:53
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10296022.html
*
* @Description 函数接口的抽象方法可以是从O、P两个父接口继承而来,但继承而来的classInfo方法是覆写等效,因此Q接口也属于函数接口
*/ interface O <T>{
T classInfo(Class<?> c);
} interface P <S>{
S classInfo(Class<?> c);
} public interface Q extends O, P{
}
函数接口(Functional Interfaces)的更多相关文章
- [二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口
函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type use ...
- Java8 函数式接口-Functional Interface
目录 函数式接口: JDK 8之前已有的函数式接口: 新定义的函数式接口: 函数式接口中可以额外定义多个Object的public方法一样抽象方法: 声明异常: 静态方法: 默认方法 泛型及继承关系 ...
- Java 8函数式接口functional interface的秘密
Java 8函数式接口functional interface的秘密 2014年10月29日 17:52:55 西瓜可乐520 阅读数:3729 目录 [−] JDK 8之前已有的函数式接口 新定 ...
- java8函数式接口(Functional Interface)
介绍 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口. 函数式接口可以被隐式转换为 lambda 表达式(箭头函数). 函数式接口代 ...
- 【Java 8】函数式接口(二)—— 四大函数接口介绍
前言 Java8中函数接口有很多,大概有几十个吧,具体究竟是多少我也数不清,所以一开始看的时候感觉一脸懵逼,不过其实根本没那么复杂,毕竟不应该也没必要把一个东西设计的很复杂. 几个单词 在学习了解之前 ...
- Spring AOP在函数接口调用性能分析及其日志处理方面的应用
面向切面编程可以实现在不修改原来代码的情况下,增加我们所需的业务处理逻辑,比如:添加日志.本文AOP实例是基于Aspect Around注解实现的,我们需要在调用API函数的时候,统计函数调用的具体信 ...
- IO端口和IO内存的区别及分别使用的函数接口
每个外设都是通过读写其寄存器来控制的.外设寄存器也称为I/O端口,通常包括:控制寄存器.状态寄存器和数据寄存器三大类.根据访问外设寄存器的不同方式,可以把CPU分成两大类.一类CPU(如M68K,Po ...
- Starter Set of Functional Interfaces
Java Development Kit 8 has a number of functional interfaces. Here we review the starter set-the int ...
- C语言的本质(15)——C语言的函数接口入门
C语言的本质(15)--C语言的函数接口 函数的调用者和其实现者之间存在一个协议,在调用函数之前,调用者要为实现者提供某些条件,在函数返回时,实现者完成调用者需要的功能. 函数接口通过函数名,参数和返 ...
- C语言的本质(16)——函数接口的传入参数与传出参数
如果函数接口有指针参数,既可以把指针所指向的数据传给函数使用(称为传入参数),也可以由函数填充指针所指的内存空间,传回给调用者使用(称为传出参数),例如strcpy的函数原型为 char *strcp ...
随机推荐
- 解决vue中滚轮事件报错 Added non-passive event listener to a scroll-blocking 'mousewheel' event.告警
参考:https://www.jianshu.com/p/23850d4cade8 参考:让页面滑动流畅得飞起的新特性:Passive Event Listeners
- NodeJS 实战系列:个人开发者应该如何选购云服务
这文章至少值一千元,因为这是我保守估计花出去的冤枉钱(请自行脑补一个苦笑的 emoji) 文章中会穿插选择云服务的一些建议,当然也会提供一些"薅羊毛"的技巧.不过在此之前我们要想清 ...
- 有一个公网IP地址
这几天在家里拉了一条300M+的宽带,但是遇到了一些坑,本文就简单说明一下如下: 突发此次需求是这样的:阿里云有台服务器公网带宽是1M的,虽说带宽小,但是数据中心的服务器显然是稳定的,只是带宽太小,有 ...
- [Linux]异常配置专题之重复配置的有效性:系统/环境变量 | hosts
1 文由 在项目中经常遇到这种情况,1个hosts文件里同一IP 或 域名存在多个映射配置,那么到底哪个有效?环境变量亦有此问题. 问题本身不难,只是为了避免混淆,进行专门记录,以加深记忆. 2 ho ...
- LeeCode 栈与队列问题(二)
LeeCode 239: 滑动窗口最大值 题目描述 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右 ...
- 今天能恢复我的Django吗——恢复了!
今天能用两小时恢复我的Django吗 实在是累了,昨天和队友改bug的时候为了能在我的电脑上实现他的程序就在datagrip中删了我django建的表.没想到啊,这一删就全是报错!! 不说了,今天看看 ...
- Linux 根据名称自动kill掉当前相关进程
ps aux | grep app | grep -v "grep" | awk '{print $2}' | xargs -r kill
- Vue的项目打包为移动端(安卓手机应用)app
现在基于vue全家桶技术体系,基本上可以开发各端的各种应用,pc端的应用,开发完成以后,直接运行打包命令 yarn build 即可打包,部署到服务器端上线即可.那么,今天我们来聊一聊,开发好的vue ...
- [C++提高编程] 2、STL初识
文章目录 2 STL初识 2.1 STL的诞生 2.2 STL基本概念 2.3 STL六大组件 2.4 STL中容器.算法.迭代器 2.5 容器算法迭代器初识 2.5.1 vector存放内置数据类型 ...
- 线上FullGC问题排查实践——手把手教你排查线上问题
作者:京东科技 韩国凯 一.问题发现与排查 1.1 找到问题原因 问题起因是我们收到了jdos的容器CPU告警,CPU使用率已经达到104% 观察该机器日志发现,此时有很多线程在执行跑批任务.正常来说 ...