当前位置: 首页 > 后端技术 > Java

初看函数式接口,无标题,无噱头,全是干货

时间:2023-04-01 20:46:11 Java

什么是函数式接口参考两处的定义,试着回答什么是函数式接口AnInterfacethatcontainsexactlyanabstractmethodisknown作为功??能接口。它可以有任意数量的默认静态方法,但只能包含一个抽象方法。它还可以声明对象类的方法。功能接口也称为单一抽象方法接口或SAM接口。它是Java中的一项新功能,有助于实现函数式编程方法。以上是javapoint)网站的定义。总结以下几点,抽象函数接口只能有一个,可以有任意多个默认静态方法。可以有Object类声明的方法。,因为所有的类都是Object的子类用于指示接口类型声明旨在成为Java语言规范定义的功能接口的信息注释类型。从概念上讲,功能接口只有一个抽象方法。由于默认方法有一个实现,它们不是抽象的。如果一个接口声明了一个抽象方法来覆盖java.lang.Object的公共方法之一,那么也不计入接口的抽象方法计数,因为接口的任何实现都将具有来自java.lang.Object或其他地方的实现。请注意,可以使用lambda表达式、方法引用或构造函数引用来创建函数式接口的实例。如果使用此注解类型对类型进行注解,则需要编译器生成错误消息,除非:该类型是接口类型而不是注解类型、枚举或类。注释类型满足功能接口的要求。但是,无论接口声明中是否存在FunctionalInterface注释,编译器都会将满足功能接口定义的任何接口视为功能接口。我们再看一下FunctionalInterface中的javadoc。最大的区别是同一个意思,但还是可以概括功能接口的实例可以用lambdas来表示。带有此类注解的方法引用或构造函数引用表明这是一个接口,而不是注解。枚举或类功能接口不需要此注释,但是如果不是带有这个注解的函数式接口,编译器就会报错。如果在网上搜索一个函数式界面,可以找到很多知识,所以现在写这篇文章是在重复同样的事情吗?其实网上很多文章都是讲java常用的函数式接口的。一样的,而且这么笼统,完全不是那种适合初学者的文章,至少我看不懂。就这样,我觉得我可以把我对函数式接口的理解写下来,接下来我就从自定义函数式接口说起。我想表达的很简单,就是自定义一个IAnimal的接口,它只有一个抽象方法talk()。两个具体的实现类实现了这个方法。还有main方法调用talk()。IAnimal.javaCat.javaDog.javaMain.java但有时你不想创建一个新类。比如接口比较简单,实现也不复杂。创建一个新类可能是多余的。这时候有些同学就会想到使用匿名内部类。说到匿名内部类,就意味着可以用lambda表达式来再次简化。简化之后的IAnimal已经是函数式接口了,整个例子都是自定义的函数式接口,所以可以发现它的本质还是一个接口。只是实现类从一个完整的类变成了一个函数。java中常用的函数式接口上面是一个简单的自定义函数式接口的例子。接下来我们看看jdk自己声明的四大函数式接口。功能接口参数类型返回类型目的主要方法Consumer\Tvoid消费类型为T的对象voidaccept(Tt)Supplier\NoneT返回类型为T的对象get()FunctionTR操作于T类型的对象,返回R类型的对象apply(Tt)Predicate\Tboolean判断T类型的对象是否满足约束,返回booleanbooleantest(Tt)Consumer输出如下SupplierforsupplierIn也就是说,我真的找不到更好的例子,或者说我找到的例子都很简单。这里稍微介绍一下supplier的懒加载特性,看看输出函数输出:Predicate输出:破产版实现了ArrayList中的forEach。可能新手们对函数式接口了解不多,但是平时编码开发中列表中的forEach入参就是一个函数式接口。接下来参考源码实现一个破产版的List和List中的forEach。创建一个新的总共有以下步骤。Student对象自定义了一个列表,里面包含了一个Student数组来存储元素,还有一个add方法和一个forEach方法(使用Consumer)转换方法,自定义了一个函数式接口,而不是ConsumerStudentMyListForEachMain。看输出:IAnyway自定义了一个函数式接口,本质上就是Consumer,然后类名和方法名都改了。这样做的目的是告诉新手同学,jdk中的四个函数接口并不是什么神奇的东西。本质上都是接口,只是jdk总结了我们常用的。场景声明这些功能接口,避免重复声明具有相同功能的功能接口。定义好接口后,再看一下MyList类使用的地方,修改一下输出:想了想写了一点,写完之后发现更乱了。我知道什么是函数式接口,即使在编码工作中也是如此。逼迫自己用了一把功能接口,并合并到公司的代码仓库中。但是,什么时候、什么情况下使用功能接口一直让我很困惑,包括google、baidu、statckoverflow,都没有更好的答案。就我而言,功能接口似乎与匿名内部类和lambda表达式是一回事。参考资料Java8FunctionalInterfaces-javatpoint