Function 和 BiFunction 的使用例

embedded/2024/12/21 12:29:49/

Function

在Java中,Function接口是java.util.function包中的一个核心函数式接口。它代表了一个接受一个参数并产生结果的函数。Function接口的主要作用是简化代码,提高可读性和可维护性,特别是在使用Lambda表达式和方法引用的情况下。以下是Function接口的一些关键点:

主要方法

  • apply(T t): 对给定的参数应用这个函数,并返回结果。
    java">Function<String, Integer> stringToLength = s -> s.length();
    int length = stringToLength.apply("Hello"); // 返回 5
    

默认方法

  • andThen(Function<? super R, ? extends V> after): 返回一个组合函数,首先将当前函数应用于输入,然后将结果作为参数传递给after函数。

    java">Function<Integer, String> intToString = Object::toString;
    Function<String, String> appendSuffix = s -> s + "!";
    Function<Integer, String> combined = intToString.andThen(appendSuffix);
    String result = combined.apply(5); // 返回 "5!"
    
  • compose(Function<? super V, ? extends T> before): 返回一个组合函数,首先将before函数应用于输入,然后将结果作为参数传递给当前函数。

    java">Function<String, Integer> stringToLength = s -> s.length();
    Function<Integer, Integer> doubleValue = i -> i * 2;
    Function<String, Integer> composed = doubleValue.compose(stringToLength);
    int result = composed.apply("Hello"); // 返回 10
    

静态方法

  • identity(): 返回一个总是返回其输入参数的恒等函数。
    java">Function<String, String> identity = Function.identity();
    String result = identity.apply("Hello"); // 返回 "Hello"
    

使用场景

  • Lambda表达式: 简化匿名内部类的编写。

    java">List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
    List<Integer> lengths = names.stream().map(s -> s.length()) // Lambda表达式.collect(Collectors.toList());
    
  • 方法引用: 直接引用已有的方法。

    java">List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
    List<Integer> lengths = names.stream().map(String::length) // 方法引用.collect(Collectors.toList());
    
  • Stream API: 在流操作中进行转换。

    java">List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
    Map<String, Integer> nameLengthMap = names.stream().collect(Collectors.toMap(Function.identity(),String::length));
    

示例代码

以下是一个完整的示例,展示了如何使用Function接口:

java">import java.util.function.Function;public class FunctionExample {public static void main(String[] args) {// 定义一个简单的Function,将字符串转换为其长度Function<String, Integer> stringToLength = s -> s.length();// 应用Functionint length = stringToLength.apply("Hello");System.out.println("Length of 'Hello': " + length);// 使用andThen方法组合两个FunctionFunction<Integer, String> intToString = Object::toString;Function<String, String> appendSuffix = s -> s + "!";Function<String, String> combined = intToString.andThen(appendSuffix);String result = combined.apply(5);System.out.println("Combined result for 5: " + result);// 使用compose方法组合两个FunctionFunction<String, Integer> stringToLengthCompose = s -> s.length();Function<Integer, Integer> doubleValue = i -> i * 2;Function<String, Integer> composed = doubleValue.compose(stringToLengthCompose);int composedResult = composed.apply("Hello");System.out.println("Composed result for 'Hello': " + composedResult);}
}

输出:

Length of 'Hello': 5
Combined result for 5: 5!
Composed result for 'Hello': 10

通过使用Function接口,可以更简洁地处理数据转换和映射操作,使代码更加清晰和易于维护。

BiFuncion

BiFunction 是 Java 8 引入的一个函数式接口,位于 java.util.function 包中。它的主要作用是表示一个接受两个输入参数并返回一个结果的函数。BiFunction 接口提供了一个方法 apply,该方法接受两个参数并返回一个结果。

主要特点

  1. 泛型参数

    • BiFunction<T, U, R> 中,TU 分别表示输入参数的类型,R 表示返回结果的类型。
  2. 方法

    • R apply(T t, U u):这是 BiFunction 接口的主要方法,接受两个参数并返回一个结果。

常见用途

  1. 数据转换

    • 可以用于将两个对象转换为一个新的对象。例如,将两个字符串拼接成一个新的字符串。
  2. 集合操作

    • 在集合操作中,可以用于生成新的元素。例如,使用 Streamcollect 方法时,可以自定义收集器。
  3. 业务逻辑

    • 在业务逻辑中,可以用于组合多个输入参数生成一个输出结果。例如,计算两个数的和。

示例代码

以下是一些使用 BiFunction 的示例代码:

拼接字符串
java">import java.util.function.BiFunction;public class BiFunctionExample {public static void main(String[] args) {BiFunction<String, String, String> concatFunction = (a, b) -> a + " " + b;String result = concatFunction.apply("Hello", "World");System.out.println(result); // 输出: Hello World}
}
计算两个数的和
java">import java.util.function.BiFunction;public class BiFunctionExample {public static void main(String[] args) {BiFunction<Integer, Integer, Integer> addFunction = (a, b) -> a + b;int result = addFunction.apply(5, 3);System.out.println(result); // 输出: 8}
}
结合 Stream 使用
java">import java.util.Arrays;
import java.util.List;
import java.util.function.BiFunction;public class BiFunctionExample {public static void main(String[] args) {List<Integer> numbers1 = Arrays.asList(1, 2, 3);List<Integer> numbers2 = Arrays.asList(4, 5, 6);BiFunction<Integer, Integer, Integer> addFunction = (a, b) -> a + b;List<Integer> result = new java.util.ArrayList<>();for (int i = 0; i < numbers1.size(); i++) {result.add(addFunction.apply(numbers1.get(i), numbers2.get(i)));}System.out.println(result); // 输出: [5, 7, 9]}
}

总结

BiFunction 是一个非常有用的函数式接口,适用于需要处理两个输入参数并返回一个结果的场景。通过使用 BiFunction,可以使代码更加简洁和易于理解。希望这些示例能帮助你更好地理解和使用 BiFunction


http://www.ppmy.cn/embedded/147530.html

相关文章

git bash中文显示问题

个人博客地址&#xff1a;git bash中文显示问题 | 一张假钞的真实世界。 默认情况下git bash中文以ASCII编码&#xff0c;不方便查看&#xff0c;如下&#xff1a; $ git status 位于分支 master尚无提交要提交的变更&#xff1a;&#xff08;使用 "git rm --cached <…

C05S11-MySQL数据库索引

一、索引 1. 索引概述 索引是一个排序的列表&#xff0c;在这个列表当中存储了索引的值和这个值对应数据所在的物理地址。使用索引之后&#xff0c;查询数据表时&#xff0c;不用全表扫描来定位数据所在行&#xff0c;而是通过索引直接找到该行数据对应的物理地址&#xff0c…

mybatisPlus使用步骤详解

1.导包&#xff1a; <!--mybatis-plus jar文件--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency> yml和之前的相比多了一个-…

浅谈Java注解之SpringBootApplication

一、SpringBootApplication的介绍 SpringBootApplication是一个组合注解&#xff0c;由Configuration、EnableAutoConfiguration和ComponentScan这三个注解组合而成。它的主要作用是标注一个 Java 类作为 Spring Boot 应用程序的启动类&#xff0c;当运行该类的main方法时&…

【HarmonyOS NEXT】Web 组件的基础用法以及 H5 侧与原生侧的双向数据通讯

关键词&#xff1a;鸿蒙、ArkTs、Web组件、通讯、数据 官方文档Web组件用法介绍&#xff1a;文档中心 Web 组件加载沙箱中页面可参考我的另一篇文章&#xff1a;【HarmonyOS NEXT】 如何将rawfile中文件复制到沙箱中_鸿蒙rawfile 复制到沙箱-CSDN博客 目录 如何在鸿蒙应用中加…

【vue2+js】记录如何校验一组数据中是否有区间重叠

界面样子 html代码片段 <template><div class"threshold-wrap"><el-form class"threshold-list" ref"form"><span v-for"(v, vIndex) in thresholdList" :key"v.id"><el-form-item prop…

【设计模式】空接口

&#xff08;空&#xff09;接口的用法总结 接口用于定义某个类的特定能力或特性。在工作流或任务管理系统中&#xff0c;接口可以帮助标识哪些任务可以在特定阶段执行。通过实现这些接口&#xff0c;任务类可以被标识为在相应的阶段可以执行&#xff0c;从而在验证和执行逻辑…

vue create 创建项目 提示 Failed to check for updates 淘宝 NPM 镜像站喊你切换新域名啦

1、使用 vue create demo创建项目的时候发现 提示 “Failed to check for updates”&#xff0c; 执行 npm config list 看了一下 镜像源是&#xff1a;https://registry.npm.taobao.org 然后搜索一下发现这个淘宝这个镜像域名切换了。 公告地址&#xff1a;【公告】淘宝 npm …