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

相关文章

Java实现MD5加密的四种方式

《Java实现MD5加密的四种方式》MD5是一种广泛使用的哈希算法,其输出结果是一个128位的二进制数,通常以32位十六进制数的形式表示,MD5的底层实现涉及多个复杂的步骤和算法,本文给大家介绍了Ja... 目录MD5介绍Java 中实现 MD5 加密方式方法一:使用 MessageDigest方法二:使用

Java中的runnable 和 callable 区别解析

《Java中的runnable和callable区别解析》Runnable接口用于定义不需要返回结果的任务,而Callable接口可以返回结果并抛出异常,通常与Future结合使用,Runnab... 目录1. Runnable接口1.1 Runnable的定义1.2 Runnable的特点1.3 使用Ru

Java中Runnable和Callable的区别和联系及使用场景

《Java中Runnable和Callable的区别和联系及使用场景》Java多线程有两个重要的接口,Runnable和Callable,分别提供一个run方法和call方法,二者是有较大差异的,本文... 目录一、Runnable使用场景二、Callable的使用场景三、关于Future和FutureTa

Spring 中 BeanFactoryPostProcessor 的作用和示例源码分析

《Spring中BeanFactoryPostProcessor的作用和示例源码分析》Spring的BeanFactoryPostProcessor是容器初始化的扩展接口,允许在Bean实例化前... 目录一、概览1. 核心定位2. 核心功能详解3. 关键特性二、Spring 内置的 BeanFactory

Spring组件初始化扩展点BeanPostProcessor的作用详解

《Spring组件初始化扩展点BeanPostProcessor的作用详解》本文通过实战案例和常见应用场景详细介绍了BeanPostProcessor的使用,并强调了其在Spring扩展中的重要性,感... 目录一、概述二、BeanPostProcessor的作用三、核心方法解析1、postProcessB

Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

《Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)》:本文主要介绍Java导入、导出excel的相关资料,讲解了使用Java和ApachePOI库将数据导出为Excel文件,包括... 目录前言一、引入Apache POI依赖二、用法&步骤2.1 创建Excel的元素2.3 样式和字体2.

Java实现将Markdown转换为纯文本

《Java实现将Markdown转换为纯文本》这篇文章主要为大家详细介绍了两种在Java中实现Markdown转纯文本的主流方法,文中的示例代码讲解详细,大家可以根据需求选择适合的方案... 目录方法一:使用正则表达式(轻量级方案)方法二:使用 Flexmark-Java 库(专业方案)1. 添加依赖(Ma

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Spring Boot拦截器Interceptor与过滤器Filter详细教程(示例详解)

《SpringBoot拦截器Interceptor与过滤器Filter详细教程(示例详解)》本文详细介绍了SpringBoot中的拦截器(Interceptor)和过滤器(Filter),包括它们的... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)详细教程1. 概述1

SpringBoot利用dynamic-datasource-spring-boot-starter解决多数据源问题

《SpringBoot利用dynamic-datasource-spring-boot-starter解决多数据源问题》dynamic-datasource-spring-boot-starter是一... 目录概要整体架构构想操作步骤创建数据源切换数据源后续问题小结概要自己闲暇时间想实现一个多租户平台,