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作 ...
随机推荐
- 2018-06-28 jq CSS处理
CSS处理 1.CSS样式 css() -> 获取jq对象的css样式 css({'':"'}) ->设置jq对象的css样式 相当于js对象的style()方法 2.位置 of ...
- 抛弃os.path,拥抱pathlib
基于Python的文件.目录和路径操作,我们一般使用的是os.path模块. pathlib是它的替代品,在os.path上的基础上进行了封装,实现了路径的对象化,api更加通俗,操作更便捷,更符编程 ...
- mysql+redis缓存策略常见的错误
什么时候应该更新缓存 应该是从数据库读取数据后,再更新缓存,从缓存读取到数据,就不需要再重新写缓存了,一个常见的错误是,每次访问接口都更新缓存,这样的话,如果接口一直有流量,那么db中的数据,就一直没 ...
- Unsafe类初探
Unsafe类是java中非常特别的一个类.它名字就叫做"不安全",提供的操作可以直接读写内存.获得地址偏移值.锁定或释放线程. 通过正常途径是无法获得Unsafe实例的,首先它的 ...
- 5.6 Go 常用函数
5.6 Go 常用函数 最正确的学习模块姿势: https://golang.org/pkg/ //golang官网 程序开发常用函数 strings处理字符串相关 统计字符串长度,按字节 len(s ...
- UVA10480 Sabotage
题目链接:https://cn.vjudge.net/problem/UVA-10480 知识点: 最小割 题目大意: 求最小割并打印出最小割必须割掉的边. 解题思路: 在跑完 \(sap\) 后的残 ...
- Redis学习笔记(十五)Sentinel(哨兵)(中)
上一篇 我们模拟了单机器下哨兵模式的搭建,那么接下来我们看下哨兵模式的实现与工作. 为什么又分成两篇呢?因为篇幅太长(偷懒),再一个这篇主要说的是Sentinel的初始化以及信息交换,下一篇着重说下状 ...
- 小程序util.js的使用
我们通过开发者工具快速创建了一个 QuickStart 项目.你可以留意到这个项目里边生成了一个utils/util.js这里写图片描述 可以将一些公共的代码抽离成为一个单独的 js (utils.j ...
- 干货!JNPF快速开发平台功能一览
JNPF,采用主流的两大技术Java/.Net开发,是一套低代码开发平台,可视化开发环境,有拖拽式的代码生成器,灵活的权限配置.SaaS服务,强大的接口对接,随心可变的工作流引擎,一站式开发多端使 ...
- 前端基础进阶(十四):es6常用基础合集
在实际开发中,ES6已经非常普及了.掌握ES6的知识变成了一种必须.尽管我们在使用时仍然需要经过babel编译. ES6彻底改变了前端的编码风格,可以说对于前端的影响非常巨大.值得高兴的是,如果你熟悉 ...