时间:2021-05-19
从 Java 8 开始便出现了函数式接口(Functional Interface,以下简称FI)
定义为: 如果一个接口只有唯一的一个抽象接口,则称之为函数式接口。为了保证接口符合 FI ,通常会在接口类上添加 @FunctionalInterface 注解。理解了函数式接口可以为 Java 函数式编程打下基础,最终可通过运用函数式编程极大地提高编程效率。
函数式接口 (Functional Interface) 就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口可以对现有的函数友好地支持 lambda。
JDK 1.8 之前已有的函数式接口:
JDK 1.8 新增加的函数接口:
网上很多教程说新增 4 个函数接口是不对的,java.util.function 它包含了很多类,用来支持 Java的 函数式编程,该包中的函数式接口 43 个,但是最主要的是这四个:
(1)功能性接口:Function<T,R>
(2)断言性接口:Predicate<T>
(3)供给性接口:Supplier<T>
(4)消费性接口:Consumer<T>
详细一点介绍:
函数式接口 参数类型 返回类型 用途 Consumer T void 对类型T参数操作,无返回结果,包含方法 void accept(T t) Supplier 无 T 返回T类型参数,方法时 T get() Function T R 对类型T参数操作,返回R类型参数,包含方法 R apply(T t) Predicate T boolean 断言型接口,对类型T进行条件筛选操作,返回boolean,包含方法 boolean test(T t)
具体的使用:
/** * Java8内置的四大核心函数式接口: * Consumer<T>:消费型接口</T> * Supplier<T>供给型接口</T> * Function<T,R>函数型接口</T,R> * Predicate<T>段言型接口</T> * boolean test(T t) */public class TestLamda3 { //Consumer<T> @Test public void test1(){ happy(10000,(m)-> System.out.println("这次消费了"+m+"元")); } public void happy(double money, Consumer<Double> con){ con.accept(money); } //Supplier<T> @Test public void test2(){ List<Integer> list= getNumList(5,()->{ return (int)Math.random()*100; }); list.forEach(System.out::println); } public List<Integer> getNumList(int num, Supplier<Integer> supplier){ List<Integer> list=new ArrayList<>(); for (int i=0; i<num;i++){ Integer n=supplier.get(); list.add(n); } return list; } //函数式接口 @Test public void test4(){ String newStr=strHandle("\t\t\t woshi nide ",(str)->str.trim()); System.out.println(newStr); } public String strHandle(String str,Function<String,String> fun){ return fun.apply(str); } //段言型接口;将满足条件的字符串放入集合中 @Test public void test5(){ List<String> list1= Arrays.asList("nihao","hiehei","woai","ni"); List<String> list=filterStr(list1,(s)->s.length()>3); for (String s : list) { System.out.println(s); } } public List<String> filterStr(List<String> list, Predicate<String> pre){ List<String> strings=new ArrayList<>(); for (String string : list) { if(pre.test(string)){ strings.add(string); } } return strings; }}全部接口:
序号 接口 & 描述 1 BiConsumer<T,U>
代表了一个接受两个输入参数的操作,并且不返回任何结果
2 BiFunction<T,U,R>代表了一个接受两个输入参数的方法,并且返回一个结果
3 BinaryOperator<T>代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果
4 BiPredicate<T,U>代表了一个两个参数的boolean值方法
5 BooleanSupplier代表了boolean值结果的提供方
6 Consumer<T>代表了接受一个输入参数并且无返回的操作
7 DoubleBinaryOperator代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。
8 DoubleConsumer代表一个接受double值参数的操作,并且不返回结果。
9 DoubleFunction<R>代表接受一个double值参数的方法,并且返回结果
10 DoublePredicate代表一个拥有double值参数的boolean值方法
11 DoubleSupplier代表一个double值结构的提供方
12 DoubleToIntFunction接受一个double类型输入,返回一个int类型结果。
13 DoubleToLongFunction接受一个double类型输入,返回一个long类型结果
14 DoubleUnaryOperator接受一个参数同为类型double,返回值类型也为double 。
15 Function<T,R>接受一个输入参数,返回一个结果。
16 IntBinaryOperator接受两个参数同为类型int,返回值类型也为int 。
17 IntConsumer接受一个int类型的输入参数,无返回值 。
18 IntFunction<R>接受一个int类型输入参数,返回一个结果 。
19 IntPredicate接受一个int输入参数,返回一个布尔值的结果。
20 IntSupplier无参数,返回一个int类型结果。
21 IntToDoubleFunction接受一个int类型输入,返回一个double类型结果 。
22 IntToLongFunction接受一个int类型输入,返回一个long类型结果。
23 IntUnaryOperator接受一个参数同为类型int,返回值类型也为int 。
24 LongBinaryOperator接受两个参数同为类型long,返回值类型也为long。
25 LongConsumer接受一个long类型的输入参数,无返回值。
26 LongFunction<R>接受一个long类型输入参数,返回一个结果。
27 LongPredicateR接受一个long输入参数,返回一个布尔值类型结果。
28 LongSupplier无参数,返回一个结果long类型的值。
29 LongToDoubleFunction接受一个long类型输入,返回一个double类型结果。
30 LongToIntFunction接受一个long类型输入,返回一个int类型结果。
31 LongUnaryOperator接受一个参数同为类型long,返回值类型也为long。
32 ObjDoubleConsumer<T>接受一个object类型和一个double类型的输入参数,无返回值。
33 ObjIntConsumer<T>接受一个object类型和一个int类型的输入参数,无返回值。
34 ObjLongConsumer<T>接受一个object类型和一个long类型的输入参数,无返回值。
35 Predicate<T>接受一个输入参数,返回一个布尔值结果。
36 Supplier<T>无参数,返回一个结果。
37 ToDoubleBiFunction<T,U>接受两个输入参数,返回一个double类型结果
38 ToDoubleFunction<T>接受一个输入参数,返回一个double类型结果
39 ToIntBiFunction<T,U>接受两个输入参数,返回一个int类型结果。
40 ToIntFunction<T>接受一个输入参数,返回一个int类型结果。
41 ToLongBiFunction<T,U>接受两个输入参数,返回一个long类型结果。
42 ToLongFunction<T>接受一个输入参数,返回一个long类型结果。
43 UnaryOperator<T>接受一个参数为类型T,返回值类型也为T。
总结
函数式接口 (Functional Interface) 就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口是为了 lambda 表达式服务,函数式接口的存在是 lambda 表达式出现的前提,lambda 表达式想关于重写了函数式接口中的唯一方法。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Java8新特性内建函数式接口 在之前的一片博文Lambda表达式,提到过Java8提供的函数式接口。在此文中,将介绍一下Java8四个最基本的函数式接口
1.函数式接口的理解根据重构的思想,需要把容易变化的模块进行抽象并封装起来,从这个点来看,Java8新引入的函数式接口就是基于这个思想进行设计的。2.函数式接口
tning接口这一个词。很多人都不知道lightning接口到底是一个什么东西,其实lightning接口就是苹果公司专门制作的一种连接器接口了,它还有一个名字
HDMI一词很多朋友可能都不会陌生,因为在液晶电视、笔记本、台上电脑接口中经常会看到HDMI字样标注。那么HDMI是什么?到底是什么接口,有什么用呢?下面来与大
HDMI一词很多朋友可能都不会陌生,因为在液晶电视、笔记本、台上电脑接口中经常会看到HDMI字样标注。那么HDMI是什么意思?到底是什么接口,有什么用呢?下面百