Java 8 新特性|函数接口 ( Functional interface )

2024-02-14 04:38

本文主要是介绍Java 8 新特性|函数接口 ( Functional interface ),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、什么是函数接口?

Java 8 引入了 「 函数接口 」 ( funtional interface ) 的概念,「 函数接口 」就是那些有且只有显式定义一个方法的接口。

函数接口为 Java 8 Lambda 表达式和方法引用提供目标类型。每个函数接口都有一个 虚 ( abstract ) 方法,成为该函数接口的函数方法。用于适配该类型的 Lambda 表达式的参数类型和返回值类型。

函数接口一般用于 Java 8 中的 Lambda 表达式 。而且 Java 8 为了支持 Lambda 表达式,更是定义了许多函数接口。这些接口基本都在 java.util.function 包中。

二、函数接口的规则

如果一个接口的实现类只需要实现一个方法,那么该接口就是函数接口。

具体来说,有以下两种情况:

  • 那些只有一个方法的接口,例如 Comparable 接口,它只有一个方法 compareTo()。

  • 那些具有多个默认方法,但有且只有一个虚方法的接口。也就是说,函数接口也可以有多个方法,但除了一个可用 Lambda 表达式来实现的方法,其它方法都必须有 default 关键字。

三、java.util.function 包中定义的函数接口

//表示接受两个不同类型的参数,但不返回任何结果的操作
BiConsumer<T,U>
//表示接受两个不同类型的参数,并返回一个其它类型的结果的操作
BiFunction<T,U,R>
//表示接受两个相同类型的参数,并返回一个同一类型的结果的操作
BinaryOperator<T>
//表示接受两个不同诶行的参数,且返回布尔类型的结果的操作
BiPredicate<T,U>
//不接受任何参数,且返回一个布尔类型的结果的操作
BooleanSupplier
//表示接受一个参数,但不返回任何结果的操作
Consumer<T>
//表示接受两个 double 类型的参数,并返回 double 类型结果的操作
DoubleBinaryOperator
//表示接受一个 double 类型的参数,但不返回任何结果的操作
DoubleConsumer
//表示接受一个 double 类型的参数,且返回一个 R 类型的结果的操作
DoubleFunction<R>
//表示一个接受两个 double 类型的参数, 且返回一个布尔类型的结果的操作
DoublePredicate
//表示一个不接受任何参数,但返回布尔类型的结果的操作
DoubleSupplier
//表示接受两个 double 类型的参数,但返回一个 int 类型的结果的操作
DoubleToIntFunction
//表示接受两个 double 类型的参数,但返回一个 long 类型的结果的操作
DoubleToLongFunction
//表示接受一个 double 类型的参数,且返回一个 double 类型的结果的操作
DoubleUnaryOperator
//表示一个接受 T 类型的参数,且返回一个 R 类型结果的函数
Function<T,R>
//表示一个接受两个 int 类型的参数,且返回一个 int 类型的结果的操作
IntBinaryOperator
//表示接受一个 int 类型的参数,但不返回任何结果的操作
IntConsumer
//表示接受一个 int 类型的参数,但返回一个 R 类型的结果的操作
IntFunction<R>
//表示接受一个 int 类型的参数,但返回布尔类型的结果的操作
IntPredicate
//表示不接受任何参数,但返回一个 int 类型的结果的操作
IntSupplier
//表示接受一个 int 类型的参数,但返回一个 double 类型的结果的操作
IntToDoubleFunction
//表示接受一个 int 类型的参数,但返回一个 long 类型的结果的操作
IntToLongFunction
//表示接受一个 int 类型的参数,且返回一个 int 类型的结果的操作
IntUnaryOperator
//表示接受两个 long 类型的参数,且返回一个 long 类型的结果的操作
LongBinaryOperator
//表示不接受任何参数,但返回一个 long 类型的结果的操作
LongConsumer
//表示接受一个 loing 类型的参数,但返回一个 R 类型的结果的操作
LongFunction<R>
//表示接受一个 long 类型的参数,但返回布尔类型的结果的操作
LongPredicate
//表示不接受任何参数,但返回一个 long 类型的结果的操作
LongSupplier
//表示接受一个 long 类型的参数,但返回一个 double 类型的结果的函数
LongToDoubleFunction
//表示接受一个 long 类型的参数,但返回 int 类型的结果的函数
LongToIntFunction
//表示接受一个 long 类型的参数,并返回一个 long 类型的结果的操作
LongUnaryOperator
//表示接受两个参数,一个为 T 类型的对象,另一个 double 类型,但不返回任何结果的操作
ObjDoubleConsumer<T>
//表示接受两个参数,一个为 T 类型的对象,另一个 int 类型,但不返回任何结果的操作
ObjIntConsumer<T>
//表示接受两个参数,一个为 T 类型的对象,另一个 double 类型,但不返回任何结果的操作
ObjLongConsumer<T>
//表示接受一个指定类型 T 的参数,但返回布尔类型的结果的操作
Predicate<T>
//表示不接受任何参数,但返回一个 T 类型的结果的操作
Supplier<T>
//表示接受两个不同类型的参数,但返回一个 double 类型的结果的操作
ToDoubleBiFunction<T,U>
//表示一个接受指定类型 T 的参数,并返回一个 double 类型的结果的操作
ToDoubleFunction<T>
//表示接受两个不同类型的参数,但返回一个 int 类型的结果的操作
ToIntBiFunction<T,U>
//表示一个接受指定类型 T 的参数,并返回一个 int 类型的结果的操作
ToIntFunction<T>
//表示接受两个不同类型的参数,但返回一个 long 类型的结果的操作
ToLongBiFunction<T,U>
//表示一个接受指定类型的参数,并返回一个 long 类型的结果的操作
ToLongFunction<T>
//表示接受一个参数,并返回一个与参数类型相同的结果的操作
UnaryOperator<T>

看起来很多接口功能都是重复的。但实际上并非如此,因为各个接口表面上看起来一样,但实际上它们有着不同的默认方法。

 

代码范例

Predicate<T> 只有一个虚方法 test(Object),该方法接受一个 T 类型的对象,然后返回布尔类型的结果。因此,我们的 Lambda 表达式的参数也是 T 类型,返回值则是布尔类型。

package com.sjh.test.java8.functionInterface;import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;public class FunctionInterfaceTest {public static void main(String args[]) {List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);// Predicate<Integer> predicate = n -> true// n is passed as parameter to test method of Predicate interface// test method will always return true no matter what value n has.System.out.println("Print all numbers:");//pass n as parametereval(list, n->true);// Predicate<Integer> predicate1 = n -> n%2 == 0// n is passed as parameter to test method of Predicate interface// test method will return true if n%2 comes to be zeroSystem.out.println("Print even numbers:");eval(list, n-> n%2 == 0 );// Predicate<Integer> predicate2 = n -> n > 3// n is passed as parameter to test method of Predicate interface// test method will return true if n is greater than 3.System.out.println("Print numbers greater than 3:");eval(list, n-> n > 3 );}public static void eval(List<Integer> list, Predicate<Integer> predicate) {for(Integer n: list) {if(predicate.test(n)) {System.out.println(n + " ");}}}
}

运行结果:

/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/...com.sjh.test.java8.functionInterface.FunctionInterfaceTest
Print all numbers:
1 
2 
3 
4 
5 
6 
7 
8 
9 
Print even numbers:
2 
4 
6 
8 
Print numbers greater than 3:
4 
5 
6 
7 
8 
9 Process finished with exit code 0

end

这篇关于Java 8 新特性|函数接口 ( Functional interface )的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/707520

相关文章

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题

《解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题》本文主要讲述了在使用MyBatis和MyBatis-Plus时遇到的绑定异常... 目录myBATis-plus-boot-starpythonter与mybatis-spring-b