java代码(14) --Java8函数式接口
Java8函数式接口
之前有关JDK8的Lambda表达式 Java代码(1)--Java8 Lambda
函数式接口可以理解就是为Lambda服务的,它们组合在一起可以让你的代码看去更加简洁
| 一、概念 |
1、什么是函数式接口
所谓函数式接口,当然首先是一个接口,然后就是在这个接口里面 只能有一个抽象方法
有关函数式接口,有个专门的注解叫 @FunctionalInterface ,该注解主要特点有:
1、该注解只能标记在“有且仅有一个抽象方法”的接口上,表示函数式接口
2、JDK8接口中的静态方法和默认方法,都不算抽象方法
3、接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中的方法,那么也不算抽象方法
4、允许java.lang.Object中的public方法
5、该注解不是必须的,如果一个接口符合‘函数式编程’定义,那么加不加该注解都没有影响,加上该注解能够让编译器更好的检查,如果编写的不是函数式接口,但是加上了@FunctionalInterface那么编译器会报错
正确示例
/**
* 函数式接口注解
*/
@FunctionalInterface
public interface PersonInterface {
/**
* 1、仅有一个抽象方法
*/
void say();
/**
* 2、java.lang.Object中的方法不算
*/
@Override
boolean equals(Object object);
/**
* 3、java8接口才可以默认的方法实现,前提是方法名称必须使用default关键字修饰
*/
default void defaultMethod(){
System.out.println("hello");
}
/**
* 4、静态方法
*/
static void staticMethod(){ }
}
错误示例
/**
* 函数式接口注解
*/
@FunctionalInterface //编译直接报错
public interface Test{ //1抽象方法
void say(); //2抽象方法
void jump();
}
加上@FunctionInterface,就代表该接口是函数式接口,只能有一个抽象方法,如果多个编译直接报错
3、为什么只能有一个抽象方法
其实这个问题很好去理解,上面说了函数式接口主要是为Lambda语法服务的,为了让代码看上去更简洁
下面通过示例来说明
public static void main(String[] args) {
PersonInterface inter =() -> System.out.println("说什么呢?");
inter.say();
//输出:说什么呢?
}
通过函数式接口+Lambda表达式让代码看上去变得简洁的,关键点在于
()->{} 就代表对say()方法的重写
如果有多个抽象方法,那么()->{ } 这种写法,编译器就不知道这个重写哪个方法了,所以这就是为什么只能有一个抽象方法的原因
| 二、综合示例 |
这里在举一个综合示例,来方便理解它们
自定义函数式接口
/**
* 自定义函数TestFunction 提供handler接口,传入的是A,返回的是B
* @param <A>
* @param <B>
*/
@FunctionalInterface
public interface MyFunction<A,B> {
B handler(A a ,A a1);
}
Student对象
@Data
@AllArgsConstructor
@ToString
public class Student {
//姓名
private String name;
//年龄
private Integer age;
}
测试类
public static void main(String[] args) {
//1.求和,传入integer返回integer类型
MyFunction<Integer,Integer> myFunction=(x,y)->{
return x+y;
};
Integer count=myFunction.handler(5,10);
System.out.println("输出总和为:"+count);
//2、求和传入integer返回String类型
MyFunction<Integer,String> myFunction1=(x,y)->{
return x+"+"+y+"="+(x+y);
};
System.out.println(myFunction1.handler(5,10));
//3、对象处理过滤对象
List<Student> students= Arrays.asList(new Student("小明",3),new Student("小白",13),new Student("小黄",19));
MyFunction<Integer,List<Student>> myFunction2=(x,y)->{
List<Student> studentList=students.stream().filter(student -> student.getAge()>x && student.getAge()<y).collect(Collectors.toList());
return studentList;
};
List<Student> list=myFunction2.handler(5,15);
list.forEach(x-> System.out.println(x));
}
运行结果:

从运行结果可以很明显看出,集合对象经过过滤只剩下一个满足条件的了。
java代码(14) --Java8函数式接口的更多相关文章
- java代码之美(14)---Java8 函数式接口
Java8 函数式接口 之前写了有关JDK8的Lambda表达式:java代码之美(1)---Java8 Lambda 函数式接口可以理解就是为Lambda服务的,它们组合在一起可以让你的代码看去更加 ...
- 简析JAVA8函数式接口
一,定义 "有且只有一个抽象方法的接口"----函数式接口的定义. @FunctionalInterface public interface Ifun{ void test(); ...
- 恕我直言你可能真的不会java第8篇-函数式接口
一.函数式接口是什么? 所谓的函数式接口,实际上就是接口里面只能有一个抽象方法的接口.我们上一节用到的Comparator接口就是一个典型的函数式接口,它只有一个抽象方法compare. 只有一个抽象 ...
- Java8 函数式接口 @FunctionalInterface以及常用Consumer<T>、Supplier<T>、Function<T, R>、Predicate<T>总结
首先看看什么是Lambda 表达式 Lambda是一个匿名函数,我们可以把Lambda表达式理解为一段可以传递的代码(将代码像数据一样传递):最简单的Lambda表达式可由逗号分隔的参数列表.-> ...
- [二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口
函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type use ...
- Java8 函数式接口-Functional Interface
目录 函数式接口: JDK 8之前已有的函数式接口: 新定义的函数式接口: 函数式接口中可以额外定义多个Object的public方法一样抽象方法: 声明异常: 静态方法: 默认方法 泛型及继承关系 ...
- java8 函数式接口——Function/Predict/Supplier/Consumer
Function 我们知道Java8的最大特性就是函数式接口.所有标注了@FunctionalInterface注解的接口都是函数式接口,具体来说,所有标注了该注解的接口都将能用在lambda表达式上 ...
- java8函数式接口详解、函数接口详解、lambda表达式匿名函数、方法引用使用含义、函数式接口实例、如何定义函数式接口
函数式接口详细定义 函数式接口只有一个抽象方法 由于default方法有一个实现,所以他们不是抽象的. 如果一个接口定义了一个抽象方法,而他恰好覆盖了Object的public方法,仍旧不算做接口的抽 ...
- 详解JAVA8函数式接口{全}
1: 函数式接口 1.1 概念 1.2 格式 1.3@FunctionalInterface注解 1.4 调用自定义函数接口 2:函数式编程 2.1:lambda的延迟执行 2.2 使用Lambda作 ...
随机推荐
- mysql-kettle-superset电商可视化数据分析
1.项目概述 需求 对电商业务中的用户.商品.订单的数据进行分析,观察运营的情况 架构 业务数据库:Mysql:存储最原始的数据 ETL:Kettle 数据仓库:Mysql:存储需要进行分析处理的数据 ...
- mybatis中 #{} 和 ${}
在mybatis中#{}表示一个占位符: 1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号 2.#在很大程度上可以防止sql注入 3.例如#{id}:#{}中的id表示输入的参数名称 ...
- JTextpane 添加行号
最近项目需求,需要在JTextPane上添加行号等信息,网上找了好久只找到JTextArea添加行号信息,copy网上的程序研究了下,发现自己改改就可以让JTextPane显示行号! 代码: pack ...
- python 调用ldap同步密码
windows + python2.7 安装 python-ldap https://www.lfd.uci.edu/~gohlke/pythonlibs/#python-ldap 2.python ...
- R的安装以及包安装
今天看论文,需要用到R语言的库,于是又折腾了半天.. 其实并没有什么太大的问题,只是在第三方包的下载方面还有python中使用R方面遇到了问题: 第三方包的导入 其实在网上有 ...
- 【雕爷学编程】MicroPython动手做(02)——尝试搭建K210开发板的IDE环境
喜欢今日头条,偶然看到广告,半个多月前交了8.9元,报名参加了头条上Python的四天培训课,呵呵,总算是有了零的开始(还是有点收获的,见https://www.sohu.com/a/38112874 ...
- netty 实现简单的rpc调用
yls 2020/5/23 netty 实现简单rpc准备 使用netty传输java bean对象,可以使用protobuf,也可以通过json转化 客户端要将调用的接口名称,方法名称,参数列表的类 ...
- 使用Buildpacks高效构建Docker镜像
1. 前言 Spring Boot 2.3.0.RELEASE 正式发布了几天了,其中有个新的特性:可以将Spring Boot应用代码直接打包为Docker镜像.这是什么科技?我赶紧去官网查了一番才 ...
- JS最通俗易懂简易轮播实现
轮播图作为前端比较简易的动画,使用非常频繁,这里记录以便使用 此轮播图为最简易自动播放,非无缝,无按钮,无缩略图和序号 想看全套轮播图可以查看我的分类轮播图全套 html 布局 <div sty ...
- PHP文件上传案例和函数
$_FILES参数详解: $_FILES["file"]["name"] – 被上传文件的名称 $_FILES["file"][" ...