返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java8之Function函数、BiFunction函数详解
  • 286
分享到

Java8之Function函数、BiFunction函数详解

JavaFunctionBiFunction新特性 2023-08-31 08:08:58 286人浏览 安东尼
摘要

众所周知,Java8提供了一下非常重要的函数式接口。今天我们就来讲讲其中一个函数式接口-----Function接口。 下面的代码就是Function接口的全部代码。接下来我们逐个分析一下。 @Fun

众所周知,Java8提供了一下非常重要的函数式接口。今天我们就来讲讲其中一个函数式接口-----Function接口。
下面的代码就是Function接口的全部代码。接下来我们逐个分析一下。

@FunctionalInterfacepublic interface Function<T, R>

@FunctionalInterface 表明该接口是一个函数式接口
T 代表参数,R 代表返回值。

第一个方法------R apply(T t)

示例代码:

public class FunctionTest {    public static void main(String[] args) {        FunctionTest functionTest = new FunctionTest();        System.out.println(functionTest.compute(1, value -> 2 * value));    }    public int compute(int a, Function<Integer, Integer> function) {        int result = function.apply(a);        return result;    }}

上述代码展示的就是Function接口中apply方法的使用,其中通过 functionTest.compute方法将两个参数传过去,在compute方法中,function使用参数进行运算。

第二个方法 ------- compose

这个方法是一个默认方法。为了方便在接口中实现具体逻辑,而添加的关键字。
我们可以看到compose方法有一个输入参数为Function类型的值,并且也会返回一个Function类型的值,重点我们看最后一句就会发现,它是先调用参数的apply 方法 再调用调用者的apply 方法

default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {        Objects.requireNonNull(before);        return (V v) -> apply(before.apply(v));    }

通过上面的分析,可以得出结果----12,即对参数先执行 value * value,在执行 value * 3。

System.out.println(functionTest2.compute(2, value -> value * 3, value -> value * value));public int compute(int a, Function<Integer, Integer> function1, Function<Integer, Integer> function2) {        return function1.compose(function2).apply(a);    }

第三个方法 ------ andThen

大家是不是觉得这个方法和上面的compose方法差不多,唯一的差别就是最后一句。该方法执行的顺序就是先执行调用者的apply方法,在执行参数的apply方法。(与compose方法相反)

default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {        Objects.requireNonNull(after);        return (T t) -> after.apply(apply(t));    }

示例代码
经过上面的分析,我们很容易得出结果,值为36。

System.out.println(functionTest2.compute(2, value -> value * 3, value -> value * value));public int compute2(int a, Function<Integer, Integer> function1, Function<Integer, Integer> function2) {        return function1.andThen(function2).apply(a);    }

第四个方法 ------ identity

static <T> Function<T, T> identity() {        return t -> t;    }

该行代码因为实现了Function中唯一的抽象方法,所以通过下面这行代码实例化出了一个 “接口” 对象,同样也会输出helloworld

Function<String, String> fun1 = Function.identity();        String str1 = fun1.apply("helloWorld");        System.out.println(str1);

看完了Function,相信大家在学习Java8的时候,都看到了还有一个叫BiFunction的类,下面我们来分析一下BiFunction

什么是BiFunction

@FunctionalInterfacepublic interface BiFunction<T, U, R>

它也是一个函数式接口,它是Function 的 另一种形式,它接收两个参数(T,U),返回一个参数(R)。那么接下来我们看看这个接口里面有哪些方法吧。

第一个方法 ------ apply

R apply(T t, U u);

示例代码:

System.out.println(functionTest2.compute4(2, 3, (value1, value2) -> value1 + value2));public int compute4(int a, int b, BiFunction<Integer, Integer, Integer> biFunction) {        return biFunction.apply(a, b);    }

上述代码,使用的就是apply方法,我们发现,其实它跟Function里面的apply其实一样,也就是多了一个参数而已。接下来,我们看第二个方法。

第二个方法 ----- andThen

源码

default <V> BiFunction<T, U, V> andThen(Function<? super R, ? extends V> after) {        Objects.requireNonNull(after);        return (T t, U u) -> after.apply(apply(t, u));    }

我们发现,andThen方法里面的参数是Function类型的,那为什么不能是BiFunction类型的呢。
andThen是先执行调用者的apply,也就是说他先调用BiFunction的apply方法,再去调用参数的apply方法;其中根据Java的规范,一个方法,只能有一个返回值。所以当执行参数的apply方法的时候,只能有一个参数,所以andThen方法里面的参数必须是Function类型的。

那么大家可能会问了,为什么BiFunction里面没有compose方法。
根据Function接口里面的compose方法,我们可以分析出,它是先执行参数的apply方法,在执行调用者的apply方法。
假如BiFunction里面有compose,又因为BiFunction接受两个参数,那么通过上面的分析,可以得出,它的compose方法的参数必定是BiFunction类型的,但是下一步执行调用者的apply方法的时候,因为只有一个参数,所以是无法满足的。所以BiFunction里面没有compose方法。



源码:

public interface Function<T, R> {         R apply(T t);         default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {        Objects.requireNonNull(before);        return (V v) -> apply(before.apply(v));    }         default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {        Objects.requireNonNull(after);        return (T t) -> after.apply(apply(t));    }         static <T> Function<T, T> identity() {        return t -> t;    }}

看注释有些绕,还是看例子

//例1public class FunctionDemo {    public static void main(String[] args) {        Function<Integer,Integer> root = (v) -> {            System.out.println("root apply");            return v + 1;// 12        };        Function<Integer,Integer> before = (v) -> {            System.out.println("before apply");            return v + 1;// 先得结果11,再传给root        };         System.out.println(root.compose(before).apply(10));        // before apply        // root apply        // 12    }}
//例2public class FunctionDemo {    public static void main(String[] args) {        Function<Integer,Integer> root = (v) -> {            System.out.println("root apply");            return v + 1;// 先得结果11,再传给after        };        Function<Integer,Integer> after = (v) -> {            System.out.println("after apply");            return v + 1;// 12        };         System.out.println(root.andThen(after).apply(10));        // root apply        // after apply        // 12    }}

例1和例2虽然参数一样,结果一样,但是相对与根函数root执行的顺序一个在前,一个在后。

Function与Consumer接口都有andThen方法,两者的区别是对参数的使用方式不同。每Consumer使用的是同一个原始参数,Function的参数只会被根函数使用一次,之后的函数使用的是前一个函数的结果做为参数。

了解了Function,其他的也就一目了然了:

BiFunction<T,U,R>:代表了一个接受两个输入参数的方法,并且返回一个结果DoubleFunction<R>:代表接受一个double值参数的方法,并且返回结果DoubleToIntFunction:接受一个double类型输入,返回一个int类型结果。DoubleToLongFunction:接受一个double类型输入,返回一个long类型结果IntFunction<R>:接受一个int类型输入参数,返回一个结果 。IntToDoubleFunction:接受一个int类型输入,返回一个double类型结果 。IntToLongFunction:接受一个int类型输入,返回一个long类型结果。LongFunction<R>: 接受一个long类型输入参数,返回一个结果。LongToDoubleFunction: 接受一个long类型输入,返回一个double类型结果。LongToIntFunction:接受一个long类型输入,返回一个int类型结果。ToDoubleBiFunction<T,U>:接受两个输入参数,返回一个double类型结果ToDoubleFunction<T>:接受一个输入参数,返回一个double类型结果ToIntBiFunction<T,U>:接受两个输入参数,返回一个int类型结果。ToIntFunction<T>:接受一个输入参数,返回一个int类型结果。ToLongBiFunction<T,U>:接受两个输入参数,返回一个long类型结果。ToLongFunction<T>:接受一个输入参数,返回一个long类型结果。

来源地址:https://blog.csdn.net/qq_43842093/article/details/127996018

--结束END--

本文标题: Java8之Function函数、BiFunction函数详解

本文链接: https://lsjlt.com/news/385000.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java8之Function函数、BiFunction函数详解
    众所周知,Java8提供了一下非常重要的函数式接口。今天我们就来讲讲其中一个函数式接口-----Function接口。 下面的代码就是Function接口的全部代码。接下来我们逐个分析一下。 @Fun...
    99+
    2023-08-31
    Java Function BiFunction 新特性
  • python Function(函数)
    函数是python为了代码最大程度地重用和最小化代码冗余而提供的基本程序结构。函数是一种设计工具,它能让程序员将复杂的系统分解为可管理的部件; 函数用于将相关功能打包并参数化。在python中可以创建如下4种函数:     1)、全局函数:...
    99+
    2023-01-31
    函数 python Function
  • 详解Java8函数式编程之收集器的应用
    目录收集器收集器应用将流转换成其他集合转换成值数据分块数据分组字符串组合收集器使用流的其他操作总结收集器 收集器是一种通用的、从流生成复杂值的结构。可以使用它从流中生成List、Se...
    99+
    2023-05-15
    Java8编程 Java8函数式编程 Java8收集器
  • MySQL数据库之内置函数和自定义函数 function
    目录1、内置函数1.1、字符串函数1.2、时间函数1.3、数学函数1.4、其他函数2、自定义函数2.1、创建函数2.2、查看函数2.3、调用函数2.4、删除函数2.5、注意事项3、函数流程结构案例前言: 函数分为两类:系...
    99+
    2022-06-15
    MySQL数据库 MySQL内置函数 MySQL自定义函数function
  • MySQL数据库之内置函数和自定义函数function
    目录1、内置函数1.1、字符串函数1.2、时间函数1.3、数学函数1.4、其他函数2、自定义函数2.1、创建函数2.2、查看函数2.3、调用函数2.4、删除函数2.5、注意事项3、函...
    99+
    2024-04-02
  • C语言 function recursion函数递归详解
    目录function recursion(函数递归)递归的中心思想为:程序一递归的两个必要条件程序一:程序二:练习求n的阶乘再来道例题function recursion(函数递归)...
    99+
    2024-04-02
  • python内置函数之eval函数详解
    目录一、简介二、语法三、举例1、计算str表达式的值2、将str转换成list3、将str转换成dict四、Reference总结一、简介 eval()函数用来执行一个字符表达式的值...
    99+
    2024-04-02
  • JavaScript的function函数详细介绍
    通过函数来封装任意多条语句,而且可以在任何地方、任何时间调用执行。 而我们的JavaScript脚本语言比较特殊,相对于C语言,它的参数是不需要数据类型加持的。返回值return,...
    99+
    2024-04-02
  • JQuery之each函数详解
    JQuery的each()函数是用来遍历一个集合(如数组或对象)的方法。它可以用于循环遍历每个元素,并对每个元素执行特定的操作。语法...
    99+
    2023-09-23
    JQuery
  • Python之map()函数详解
    文章目录 一、map() 函数简介1.1 map() 函数基本语法1.2 map() 函数+ lambda表达式1.3 map() 函数输入多个可迭代对象iterable1.4 查看返回的迭代...
    99+
    2023-09-24
    python 开发语言
  • Python入门之三角函数atan2()函数详解
    描述 atan2() 返回给定的 X 及 Y 坐标值的反正切值。 语法 以下是 atan2() 方法的语法: import math math.atan2(y, x) 注意:atan2()是不能...
    99+
    2022-06-04
    函数 详解 入门
  • Oracle分析函数之开窗函数over()详解
    分析函数是什么? 分析函数是Oracle专门用于 解决复杂报表统计需求 的功能强大的函数, 它可以在数据中进行分组然后计算基于组的某种统计值 ,并且每一组的每一行都可以返回一个统计值。 ...
    99+
    2024-04-02
  • Python学习:函数(function
    编写函数def是可执行的代码。Python函数是有一个新的语句便携的,即def。不像C这样的编译语言,def是一个可执行的语句,函数并不存在,知道Python运行了def后才存在。事实上,if语句、while语句升至是其他的 def中嵌套都...
    99+
    2023-01-31
    函数 Python function
  • 函数Function怎么用
    这篇文章主要介绍了函数Function怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。函数Function概述:函数是完成特定任务的可重复调用的代码段,是JavaScri...
    99+
    2023-06-03
  • 机器学习之损失函数(Loss Function)
    损失函数(Loss Function)是机器学习和深度学习中的关键概念,它用于衡量模型的预测与实际目标之间的差异或误差。损失函数的选择对于模型的训练和性能评估至关重要,不同的任务和问题通常需要不同的损失函数。 以下是一些常见的损失函数以及它...
    99+
    2023-08-30
    神经网络 人工智能 深度学习
  • javascript之函数进阶详解
    目录函数定义方式函数的调用(6种)this指向问题严格模式高阶函数闭包递归:函数里面调用自己,需要有结束条件函数定义方式 function fn(){}//命名函数 var ...
    99+
    2024-04-02
  • JavaScript基础之函数详解
    目录一、函数简介1.1.函数的创建1.2.函数的参数和返回值二、函数的类型2.1. 构造函数2.2. 立即执行函数2.3. 构造函数的原型prototype2.4. 函数中的this...
    99+
    2024-04-02
  • 详解C语言之函数
    目录函数的调用函数调用方式函数嵌套调用递归调用内部函数与外部函数内部函数外部函数局部变量与全局变量局部变量全局变量总结函数的调用 函数调用方式 函数语句调用 函数表...
    99+
    2024-04-02
  • SQL自定义函数function
    https://blog.csdn.net/qq_23833037/article/details/53170789https://www.cnblogs.com/youring2/p/4916400.ht...
    99+
    2024-04-02
  • function函数怎么使用
    这篇“function函数怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“function函数怎么使用”文章吧。fun...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作