JDK8新特性-Function接口与BiFunction接口

JDK8系列之使用Function函数式接口 函数式接口jdk8新特性之一,函数式接口是只包含一个抽象方法声明的接口。按分类主要分为四大接口类型: Function、Consumer、Predicate、Supplier。 阅读详情

Function 接口

  • JDK8新增的函数式接口
  • 接口只有一个抽象方法apply, 接受一个T类型参数, 返回一个R类型参数, T, R表示泛型, 可以相同
  • 除了一个抽象的apply方法之外, Function存在两个默认的default方法, compose和andThen, 这两个方法都是用来组合不同的Function的
  • 这个函数式接口被大量应用于集合以及Stream(流)中

apply 方法

/**
 * 输入一个T类型的参数
 * 返回一个R类型的值
 */
R apply(T t);

compose 方法

/**
 * 接口默认方法
 * 组合两个函数方法, 返回一个新的函数
 * before的apply方法输入一个V类型的参数, 返回一个T类型的参数
 * 当前的Funtion的apply方法是输入一个T类型的参数, 返回一个R类型的参数
 * 两个函数组合之后, 返回一个新的Function, 新的Function输入一个V类型的参数, 返回一个R类型的参数
 * 简单来说, 入参功能 : V -> T, 当前函数功能 : T -> R, 返回函数功能 : V -> R
 */
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
    // 非空判断
    Objects.requireNonNull(before);
    return (V v) -> apply(before.apply(v));
}

andThen 方法

/**
 * 组合两个函数方法, 返回一个新的函数
 * after的apply方法输入一个R类型的参数, 返回一个V类型的参数
 * 当前的Funtion的apply方法是输入一个T类型的参数, 返回一个R类型的参数
 * 两个函数组合之后, 返回一个新的Function, 新的Function输入一个T类型的参数, 返回一个V类型的参数
 * 简单来说, 入参功能 : R -> V, 当前函数功能 : T -> R, 返回函数功能 : T -> V
 */
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
    // 非空判断
    Objects.requireNonNull(after);
    return (T t) -> after.apply(apply(t));
}

API使用样例

    public static void main(String[] args) {
        Function<Integer, Integer> function1 = value -> value * 2;
        Function<Integer, Integer> function2 = value -> value + 3;
        Function<Integer, Integer> function3 = function1.compose(function2);
        Function<Integer, Integer> function4 = function1.andThen(function2);
        // function3,先执行function2的apply方法再执行function1的apply方法, 所以结果为(2 + 3) * 2 = 10
        System.out.println("function3 : " + function3.apply(2));
        // function4,先执行function1的apply方法再执行function2的apply方法, 所以结果为2 * 2 + 3 = 7
        System.out.println("function4 : " + function4.apply(2));

        Function<Integer, String> function5 = value -> "Hello World " + value;
        Function<String, List<String>> function6 = value -> new ArrayList<>(Arrays.asList(value));
        Function<Long, Integer> function7 = value -> value.intValue();
        // function8 是function6调用compose组合function5
        // function6是String->List<String>, function5是Integer->String, 所以组合之后,Function8是Integer->List<String>
        Function<Integer, List<String>> function8 = function6.compose(function5);
        // function9 是function7调用andThen方法组合function5
        // function7是Long->Integer, function5是Integer->String, 所以组合之后,Function9是Long->String
        Function<Long, String> function9 = function7.andThen(function5);
        // 输出: [Hello World 1]
        System.out.println(function8.apply(1));
        // 输出: Hello World 100
        System.out.println(function9.apply(100L));
     }

Stream中使用举例

Funtion接口大量被用于集合和流中, 下面就简单举一个例子, 看下Function在Stream中的应用
场景 :

  • 遍历一个List, 将其中小写字母都转换成大写字母进行输出
  • Function 接口的实现负责将小写转换成大写, 代码如下:
        List<String> list = new ArrayList<>(Arrays.asList("biluo", "huangquan", "hongchen", "zimo"));
        Function<String, String> function = item -> item.toUpperCase();
        list.stream().map(function).forEach(item -> System.out.println(item));

输出 :

BILUO
HUANGQUAN
HONGCHEN
ZIMO

更多的用法, 需要进一步了解一下Stream了, 这里只是简单举个栗子

BiFunction接口

  • JDK8新增函数式接口
  • 可以理解为Function的一种扩展, Function接口接收一个参数, 返回一个参数; BiFunction接口接受两个参数, 返回一个参数
  • 唯一的抽象方法apply, 接收两个参数, 返回一个参数
  • 存在一个默认方法addThen, 由于apply方法接收两个参数, 所以不存在compose方法
  • 和Function一样, 在集合与Stream流中均有应用

apply 方法

    /**
     * 输入两个参数, 类型分别是T和U, 返回一个结果, 类型为R
     * @param t 函数第一个输入参数
     * @param u 第二个输入参数
     * @return 返回结果
     */
    R apply(T t, U u);

andThen 方法

/**
 * 传入一个Function类型,该Function类型输入参数为R, 返回结果类型为V
 * 当前BiFunction的apply函数输入参数类型为T, U; 返回结果类型为R
 * 将两个参数组合之后返回一个新的BiFunction方法, 输入参数是T,U,返回结果类型为V
 * 简单来说就是当前的BiFunction是(T, U) -> R, 传入的Function是R -> V
 * 所以组合后的新的Function是(T, U) -> V, 即把BiFunction的返回结果作为入参再传入Function中
 */
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));
}

BiFunction没有Compose方法是因为BiFunction的apply方法要接收两个参数, 而不管是Function还是BiFunction乃至所有的Java方法, 返回结果都只有一个

API代码样例

    public static void main(String[] args) {
        BiFunction<Integer, Integer, Integer> biFunction = (num1, num2) -> num1 + num2;
        // 输出 : 5
        System.out.println(biFunction.apply(2, 3));
        Function<Integer,Integer> function = num -> num * num;
        // newBiFunction的apply(num1, num2)方法等于function.apply(biFunction(num1, num2))
        BiFunction<Integer, Integer, Integer> newBiFunction = biFunction.andThen(function);
        // 输出 : 25
        System.out.println(newBiFunction.apply(2, 3));

        BiFunction<Integer, Integer, List<Integer>> biFunction2 = (num1, num2) -> new ArrayList<>(Arrays.asList(num1, num2));
        Function<List<Integer>,String> function2 = list -> list.toString();
        BiFunction<Integer, Integer, String> newBiFunction2 = biFunction2.andThen(function2);
        System.out.println(newBiFunction2.apply(1, 2));
    }

集合中使用举例

HashMap中的compute方法接收一个BiFunction类型的参数

        Map<String, String> map = new HashMap<>();
        map.put("name", "qiyexue");
        BiFunction<String, String, String> biFunction = (k, v) -> k + " : " + map.get(k).toUpperCase();
        System.out.println(map.compute("name", biFunction));

输出 :

name : QIYEXUE

使数组的左下三角元素中的值乘以n 1 题目 函数:fun(int a[][N], int n) 功能:使数组的左下三角元素中的值乘以n 描述:程序定义了 N*N 的二维数组,并在主函数中自动赋值。 举例: 若 n 的值为3,a数组中的值为 1 9 7 3 9 7 2 3 8 则返回主程序后 a 数组中的值应该为 3 9 7 9 27 7 6 9 24 2 思路 利用二重循环解决 在第二层需要进行一点注意的地方 3 代码 # include <stdio.h> # include <stdlib. 阅读详情

相关推荐

Sonatype nexus3 数据迁移及升级3.71+(迁移到H2数据库)

nexus3旧版本OrientDB升级H2,及整体迁移nexus3数据到其它服务器。

葫芦娃 5481

JDK8 Function用法详解最全

入口 Function<T,R> function是传一个参数返回一个参数 这个可以用场景总结一。集合遍历对于对象的处理等等 一.原生的用法 实现接口 public class FunctionObj implements Function { @Override public Object apply(Object t) { return "原生的用法实现接口"+t; } } public class Test { // p

weixin_41202749的博客 4071

AI算力网络通信领域QoS保障的测试方法

在当今数字化时代,AI技术蓬勃发展,AI算力网络应运而生。它将分布在不同地理位置的算力资源进行整合,以高效地支持各种AI应用,如深度学习训练、智能图像识别等。而通信领域则是信息传输的基石,确保数据能够准确、快速地在不同节点之间传递。QoS保障在通信领域至关重要,它可以确保不同类型的业务(如语音通话、视频会议、在线游戏等)获得其需求相匹配的服务质量。在AI算力网络中,QoS保障同样不可或缺,因为AI任务对网络的带宽、延迟、可靠性等指标有严格要求。

AI算力网络与通信的博客 504

JDK8 函数式接口 -干货使用Function 详细讲解快速上手

函数式接口 随着JDK 不断升级,大多数企业都采用了JDK1.8 版本 ,函数式接口 也普遍被应用在底层源码中,目前主要和大家分享1.8包中FunctionBIFunction 什么是java.util.function.Function包? Function<T, R>中的Java 8中引入的内置功能接口java.util.functionFunction<T, R>...

jjc120074203的博客 4725

【JAVA8】Map新方法,别再重复造车轮了

java8 Map添加的新方法,你知道吗?会用吗?

胖虎儿的博客 8652

Jdk8新特性三:jdk8之函数式编程Function

Jdk8新特性三:jdk8之函数式编程Function 文章目录Jdk8新特性三:jdk8之函数式编程FunctionFunction接口的使用BiFunction接口解决传入两个参数问题JDK8函数式编程消费型接口Consumer\Function接口的使用 Lambda表达式必须先定义接口,创建相关方法后才能使用,这样弄十分不便,干脆开发者就直接内置了接口,所有标注@FunctionalIn...

公子&小白的博客 4698

Java8新特性FunctionBiFunction使用

闲话不多说,直接看代码,注释都写的很清楚了。 package com; import java.util.function.BiFunction; import java.util.function.Function; public class DemoFunction { public static void main(String[] args) { ...

weixin_30588827的博客 376

JDK8新特性02:常用函数式接口

JDK8新特性02:常用函数式接口:FunctionBiFunction`Function`接口:单输入单输出函数`Function`接口的意义`Function`的串联: `compose()`,`andThen()``BiFunction`接口:双输入单输出函数`BiFunction`接口的意义`BiFunction``Function`的串联:`andThen()` Function接口...

ncepu_Chen的博客 579

java function 使用_Java8新特性FunctionBiFunction使用

packagecom;importjava.util.function.BiFunction;importjava.util.function.Function;public classDemoFunction {public static voidmain(String[] args) {DemoFunction t1= newDemoFunction();//Function函数的使用Inte...

weixin_39863155的博客 490

JDK 8新特性-Lambda表达式 精品文章总结

文章目录一. 前言1.2 认识Lambda表达式二. Lambda 表达式的格式2.1 语法格式一: 无参数,无返回值,Lambda体只有一条语句2.2 语法格式二: 有一个参数,并且无返回值2.3 语法格式三: 有两个以上的参数,并且有返回值,并且Lambda体有多条语句2.4 若Lambda体中只有一条语句,`return`和大括号`{}`都可以省略2.5 Lambda表达式的参数列表数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即:"类型推断"三. 函数式接口3.1 什么是函数式接

博客简介 3063

JDK8 新特性Function接口

源码(删除了源码注释): package java.util.function; import java.util.Objects; @FunctionalInterface public interface Function&amp;amp;amp;lt;T, R&amp;amp;amp;gt; { R apply(T t); default &amp;amp;amp;lt;V&amp;amp;amp;gt; Function&am

kaven 6372

【Java】Jdk8函数接口Supplier、Function、Predicate、Consumer、BiFunction、BiPredicate、BiConsumer

Supplier、Function、Predicate、Consumer、BiFunction、BiPredicate、BiConsumer是Java函数式接口的一部分,它们用于定义不同类型的函数,从而在函数式编程中提供了更灵活的方式来处理数据。Supplier:表示一个供应商,它不接受任何参数,但返回一个结果。它的抽象方法为T get(),用于获取一个结果。Function:表示一个函数,它接受一个参数并返回一个结果。它的抽象方法为,用于将输入参数转换为输出结果。

zxcyxg123的博客 2302

JDK 8-函数式编程】4.2 BiFunction

一、BiFunction 二、改造上节课:四则运算

ladymorgana的博客 221

java8 函数式接口——Function/Predict/Supplier/Consumer

Function 我们知道Java8的最大特性就是函数式接口。所有标注了@FunctionalInterface注解的接口都是函数式接口,具体来说,所有标注了该注解的接口都将能用在lambda表达式上。 接口介绍 /** * Represents a function that accepts one argument and produces a result. * * &l...

weixin_30700099的博客 404

BiFunction

具体来说,BiFunction接口中有一个apply方法,该方法接受两个参数并返回一个结果。由于该接口是函数式接口,因此可以使用Lambda表达式或方法引用来创建BiFunction对象,从而实现功能模块化、代码简洁等好处。创建一个 BiFunction 接口类型的对象 adder,该对象可以接收两个Integer类型的参数,并返回一个Integer类型的结果。在Java中,BiFunction是一种函数式接口,它表示一个可以接受两个参数并返回一个结果的函数。

weixin_41812346的博客 2735

jdk8Function<T,R>场景应用

日常编程中,如果使用Idea时总会遇到破浪线的代码块,鼠标悬浮上去,提示Found Duplicated Code in XXX。从代码设计的角度来讲,不符合DRY(Don't Repeat Yourself)原则。那我们又如何改善你眼前看到的一切呢?对于大多数同学来讲,肯定视而不见;但对于那么一丢丢同学来讲,却无法接受这样的代码,总想重构一下。...

秋夜无霜 4464

BiFunction接口源码理解

java源码理解。

ewbie的博客 735

java中BiFunctionFunction详解

关于Lambda详见lambda描述。关于函数式接口详见函数式接口 首先我们来看一下BiFunction类,代码如下: package java.util.function; import java.util.Objects; /**  * Represents a function that accepts two arguments and produces a result.  * ...

weixin_39935887的博客 9569

Java学习——HashMap

HashMap 双列集合,包含两个值,值键,键唯一,允许null的值和null键。 不保证集合元素的顺序。 构造方法 HashMap() 构造一个空的 HashMap ,默认初始容量(16)和默认负载系数(0.75)。 HashMap(int initialCapacity) 构造一个空的 HashMap具有指定的初始容量和默认负载因子(0.75)。 HashMap(int initialCapacity, float loadFactor) 构造一个空的 HashMap具有指定的初始容量和负载因子。 H

967

ghidra11.0.2

Ghidra是一个软件逆向工程(SRE)框架,包括一套功能齐全的高端软件分析工具,使用户能够在各种平台上分析编译后的代码,包括Windows、Mac OS和Linux。功能包括反汇编,汇编,反编译,绘图和脚本,以及数百个其他功能。Ghidra支持各种处理器指令集和可执行格式,可以在用户交互模式和自动模式下运行。用户还可以使用公开的API开发自己的Ghidra插件和脚本。

上一篇: leetcode63. 不同路径 II
下一篇: JDK8新特性-Predicate 接口
七夜丶雪
博客等级 码龄16年 246粉丝 241原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值