定义

首先,我们先看看函数接口在《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)的更多相关文章

  1. [二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口

    函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type use ...

  2. Java8 函数式接口-Functional Interface

    目录 函数式接口: JDK 8之前已有的函数式接口: 新定义的函数式接口: 函数式接口中可以额外定义多个Object的public方法一样抽象方法: 声明异常: 静态方法: 默认方法 泛型及继承关系 ...

  3. Java 8函数式接口functional interface的秘密

    Java 8函数式接口functional interface的秘密 2014年10月29日 17:52:55 西瓜可乐520 阅读数:3729   目录 [−] JDK 8之前已有的函数式接口 新定 ...

  4. java8函数式接口(Functional Interface)

    介绍 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口. 函数式接口可以被隐式转换为 lambda 表达式(箭头函数). 函数式接口代 ...

  5. 【Java 8】函数式接口(二)—— 四大函数接口介绍

    前言 Java8中函数接口有很多,大概有几十个吧,具体究竟是多少我也数不清,所以一开始看的时候感觉一脸懵逼,不过其实根本没那么复杂,毕竟不应该也没必要把一个东西设计的很复杂. 几个单词 在学习了解之前 ...

  6. Spring AOP在函数接口调用性能分析及其日志处理方面的应用

    面向切面编程可以实现在不修改原来代码的情况下,增加我们所需的业务处理逻辑,比如:添加日志.本文AOP实例是基于Aspect Around注解实现的,我们需要在调用API函数的时候,统计函数调用的具体信 ...

  7. IO端口和IO内存的区别及分别使用的函数接口

    每个外设都是通过读写其寄存器来控制的.外设寄存器也称为I/O端口,通常包括:控制寄存器.状态寄存器和数据寄存器三大类.根据访问外设寄存器的不同方式,可以把CPU分成两大类.一类CPU(如M68K,Po ...

  8. Starter Set of Functional Interfaces

    Java Development Kit 8 has a number of functional interfaces. Here we review the starter set-the int ...

  9. C语言的本质(15)——C语言的函数接口入门

    C语言的本质(15)--C语言的函数接口 函数的调用者和其实现者之间存在一个协议,在调用函数之前,调用者要为实现者提供某些条件,在函数返回时,实现者完成调用者需要的功能. 函数接口通过函数名,参数和返 ...

  10. C语言的本质(16)——函数接口的传入参数与传出参数

    如果函数接口有指针参数,既可以把指针所指向的数据传给函数使用(称为传入参数),也可以由函数填充指针所指的内存空间,传回给调用者使用(称为传出参数),例如strcpy的函数原型为 char *strcp ...

随机推荐

  1. [SrpingBoot]初步搭建springboot应用,报错:Failed to configure a DataSource: 'url' attribute is not specified and no embedd[转载]

    1 错误信息 Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource ...

  2. 近万字总结:Java8 Stream流式处理指南

    总结/朱季谦 在实际项目当中,若能熟练使用Java8 的Stream流特性进行开发,就比较容易写出简洁优雅的代码.目前市面上很多开源框架,如Mybatis- Plus.kafka Streams以及F ...

  3. 百度松果菁英班--oj赛(第二次)

    目录 一.小码哥剪绳子 二.咖啡品鉴师小码哥 三.均分糖果 四.持盾 五.活动安排 六.甜品供应 七.斐波那契数列的组合 八.小码哥的布阵指挥 九.活动分组 十.外卖递送 一.小码哥剪绳子 题目:马上 ...

  4. Vue中Key值的一些问题

    1. Vue里面的key是一个特殊的变量,在元素当中是不体现出来的 2. 在解析成虚拟DOM的是,如果我们没有写key值,那么这个key就类似于下标 0 , 1 , 2 , 3.... 3. 使用列表 ...

  5. Go/Python 基于gRPC传输图片

    python程序作为服务端,Go程序作为客户端,基于gPRC进行通信 客户端 定义proto文件: syntax = "proto3"; option go_package = & ...

  6. 2009年NOIP提高组真题-HanKson的趣味题(GCD&LCM优化)

    2009年NOIP提高组真题-HanKson的趣味题(GCD&LCM优化) 本题的编码是用Python实现的,C++的思路也是相同的. 希望本文能够帮助到你! 题目: 暴力法: 直接根据题目的 ...

  7. 深度学习--全连接层、高阶应用、GPU加速

    深度学习--全连接层.高阶应用.GPU加速 MSE均方差 Cross Entropy Loss:交叉熵损失 Entropy 熵: 1948年,香农将统计物理中熵的概念,引申到信道通信的过程中,从而开创 ...

  8. Mac 下 brew安装慢的问题

    brew默认源使用的是github,可以设置环境变量达到切换源的效果,见官网: https://github.com/Homebrew/install export HOMEBREW_BREW_GIT ...

  9. UniApp小程序开发如何获取用户手机号

    我们在小程序开发的时候经常遇到这种需求,需要在账号登陆的时候进行手机号获取,并使用手机号登陆. 本文讲述如何在前后端分离的状态下获取手机号 查阅官网文档不难发现我们需要使用uni.login()这个方 ...

  10. python自产调试工具pdb的使用

    python自产调试工具pdb的使用 介绍 调试打印在写代码的时候不可避免 项目越大,调试可能花的时间会越多 print调试可能是最早用的,一段时间内你都会习惯这种方式 一旦成了老鸟,你应该会去用ID ...