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作 ...
随机推荐
- 记录下做攻防世界的misc题
0x00 记录一下,代表自己做过 0x01 flag_universe 看简介是来自2018年的百越杯. 将文件下载下来后,就一个flag_universe.pcapng文件,wireshark打开. ...
- 【雕爷学编程】MicroPython动手做(07)——零基础学MaixPy之机器视觉
机器视觉 machine vision机器视觉是人工智能正在快速发展的一个分支.机器视觉作为生产过程中关键技术之一,在机器或者生产线上,机器视觉可以检测产品质量以便将不合格的产品剔除,或者指导机器人完 ...
- 「雕爷学编程」Arduino动手做(34)——三色LED交通灯模块
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...
- python中copy与deepcopy的区别
目录 区别 python代码举例 区别 高级语言中变量是对内存及其地址的抽象 copy.copy(object), 拷贝的是内嵌套结构的地址引用,当前到结构发生变化的时候,浅拷贝也相应的改变. cop ...
- 06.drf(django)的权限
默认配置已经启用权限控制 settings 'django.contrib.auth', 默认 migrate 会给每个模型赋予4个权限,如果 ORM 类不托管给django管理,而是直接在数据库中建 ...
- Jquery学习2---倒计时
以下代码是mvc4.0代码,其功能是让页面上的数字3,变2,变1 然后跳转页面 @{ ViewBag.Title = "LoginOut"; } <html> < ...
- poj3683 2-SAT 同上一道
Priest John's Busiest Day Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10151 Accep ...
- HDU6035 Colorful Tree
题目链接:https://vjudge.net/problem/HDU-6035 题目大意: 多样例输入. 对于每一个样例,给出 n \((2 \le n \le 200000)\) 个结点的一棵树, ...
- .Net基础之3——运算符
(3)Convert类型转换 1.类型如果相兼容的两个变量,可以使用自动类型转换或者显示类型转换. 但是如果两个类型的变量不兼容,这个时候可以使用一个叫做Convert的转换工厂进行转换. 注意:使用 ...
- element 的 Cascader 级联选择器设定默认值
Cascader 级联选择器 发现在很多的CRM管理系统里面,都有不少页面是用到这种级联选择器的,确实,功能很实用, 不过要设置默认值则应该让不少人头痛,因为你选择的时候 @change 事件的参数就 ...