Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >java入门之Function<T, R>详解

java入门之Function<T, R>详解

作者头像
jack.yang
发布于 2025-04-05 08:51:14
发布于 2025-04-05 08:51:14
710
举报

一、源码分析 package java.util.function;

import java.util.Objects;

/** * 表示接受一个参数并生成结果的函数。 * * <p>这是一个<a href="package-summary.html">函数式接口</a>,其功能方法为{@link #apply(Object)}。 * * @param <T> 函数输入的类型 * @param <R> 函数结果的类型 * * @since 1.8 */ @FunctionalInterface public interface Function<T, R> {

/** * 将此函数应用于给定的参数。 * * @param t 函数参数 * @return 函数结果 */ R apply(T t);

/** * 返回一个组合函数,先将{@code before}函数应用于其输入,然后将此函数应用于结果。 * 如果任一函数的评估引发异常,则将其传递给组合函数的调用者。 * * @param <V> {@code before}函数的输入类型,以及组合函数的输入类型 * @param before 在应用此函数之前应用的函数 * @return 先应用{@code before}函数,然后应用此函数的组合函数 * @throws NullPointerException 如果before为null * * @see #andThen(Function) */ default <V> Function<V, R> compose(Function<? super V, ? extends T> before) { Objects.requireNonNull(before); return (V v) -> apply(before.apply(v)); }

/** * 返回一个组合函数,先将此函数应用于其输入,然后将{@code after}函数应用于结果。 * 如果任一函数的评估引发异常,则将其传递给组合函数的调用者。 * * @param <V> {@code after}函数的输出类型,以及组合函数的输出类型 * @param after 在应用此函数之后应用的函数 * @return 先应用此函数,然后应用{@code after}函数的组合函数 * @throws NullPointerException 如果after为null * * @see #compose(Function) */ default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) { Objects.requireNonNull(after); return (T t) -> after.apply(apply(t)); }

/** * 返回一个始终返回其输入参数的函数。 * * @param <T> 函数的输入和输出对象的类型 * @return 始终返回其输入参数的函数 */ static <T> Function<T, T> identity() { return t -> t; } }

二、应用用例讲解

接下来,让我们举几个例子说明`Function`接口的使用方式:

```java import java.util.function.Function;

public class Main { public static void main(String[] args) { // Example 1: 使用compose方法组合两个函数 Function<Integer, String> intToString = Object::toString; Function<String, String> quote = s -> "'" + s + "'"; Function<Integer, String> quoteIntToString = quote.compose(intToString); System.out.println(quoteIntToString.apply(123)); // 输出:'123'

// Example 2: 使用andThen方法组合两个函数 Function<String, Integer> stringToInt = Integer::parseInt; Function<String, Integer> lengthPlusOne = s -> s.length() + 1; Function<String, Integer> stringLengthPlusOne = stringToInt.andThen(lengthPlusOne); System.out.println(stringLengthPlusOne.apply("Hello")); // 输出:6

// Example 3: 使用identity方法 Function<String, String> identityFunction = Function.identity(); System.out.println(identityFunction.apply("Java")); // 输出:Java } } ```

这些例子展示了如何使用`Function`接口的`compose`、`andThen`方法以及`identity`方法来组合和创建函数。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
图解jdk1.8新特性(2)---Lambda
图解jdk1.8新特性(2)---Lambda 简要说明 jdk常用函数式接口 Predicate @FunctionalInterface public interface Predicate<T>
SecondWorld
2019/10/24
2980
图解jdk1.8新特性(2)---Lambda
你真的了解lambda吗?一文让你明白lambda用法与源码分析
本文链接: http://www.cmlanche.com/2018/07/22/lambda用法与源码分析/
程序猿DD
2018/08/17
5760
你真的了解lambda吗?一文让你明白lambda用法与源码分析
【小家java】java8新特性之---函数式接口(Supplier、Consumer、Predicate、Function、UnaryOperator,通往高阶设计的好工具)
首先,它还是一个接口,所以必须满足接口最基本的定义。但它是一个特殊的接口:SAM类型的接口(Single Abstract Method)。可以在调用时,使用一个lambda表达式作为参数。 定义要求:
YourBatman
2019/09/03
1K0
【小家java】java8新特性之---函数式接口(Supplier、Consumer、Predicate、Function、UnaryOperator,通往高阶设计的好工具)
Java 8 Function 函数接口
在 Java 8 中,Function 接口是一个函数接口,它位于包 java.util.function 下。Function 接口中定义了一个 R apply(T t) 方法,它可以接受一个泛型 T 对象,返回一个泛型 R 对象,即参数类型和返回类型可以不同。
未读代码
2021/08/12
7370
玩转Java8的 Stream 之函数式接口
函数式接口是伴随着Stream的诞生而出现的,Java8Stream 作为函数式编程的一种具体实现,开发者无需关注怎么做,只需知道要做什么,各种操作符配合简洁明了的函数式接口给开发者带来了简单快速处理数据的体验。
搜云库技术团队
2020/06/04
4250
【Java 基础篇】Java Function 接口详解
在 Java 编程中,Function 接口是一个非常重要的函数式接口,它允许你定义一个接受一个参数并产生结果的函数。Function 接口通常在各种数据处理和转换操作中使用,例如集合处理、流处理以及函数式编程。
繁依Fanyi
2023/10/12
3K0
【Java 基础篇】Java Function 接口详解
java函数式接口
这个接口可以使用@FunctionalInterface声明,如果不满足条件,则会报错,可以通过这个方式来判断是否为函数式接口
仙士可
2023/03/09
4220
java函数式接口
Java 中的 Pipeline 设计模式
原文链接:https://www.baeldung.com/java-pipeline-design-pattern
明明如月学长
2023/03/12
2.1K0
Java 中的 Pipeline 设计模式
终于看懂别人的代码了!总结Java 8之Lambda表达式的写法套路
Thread里面需要传的是一个Runnable接口,为什么我们可以直接一个括号(),加上->,然后直接sout呢?
行百里er
2020/12/02
4520
终于看懂别人的代码了!总结Java 8之Lambda表达式的写法套路
函数式接口
所谓的函数式接口,实际上就是接口里面只能有一个抽象方法的接口。Comparator接口就是一个典型的函数式接口,它只有一个抽象方法compare。
HLee
2021/08/15
7400
函数式接口
隔壁老王都熟练使用函数式接口了,你还在等什么?(快来收藏)
  最近刚好有空给大家整理下JDK8的特性,这个在实际开发中的作用也是越来越重了,本文重点讲解下函数式接口内容。
用户4919348
2021/06/10
2690
Java8 Stream的总结
Stream是Java 8新增的接口,Stream可以认为是一个高级版本的 Iterator。它代表着数据流,流中的数据元素的数量可以是有限的,也可以是无限的。
fengzhizi715
2018/08/24
3960
Java8 Stream的总结
Java从入门到精通十六(函数式接口编程)
在使用函数式接口的时候,非常适用的是我们可以用lambda去创建接口的对象。很方便判断一个接口是不是一个函数式接口的办法就是在接口上方添加注解@FunctionalInterface进行检测。
兰舟千帆
2022/07/16
3430
Java从入门到精通十六(函数式接口编程)
JDK1.8新特性(四):函数式接口
上一篇JDK1.8新特性(三):Lambda表达式,让你爱不释手,只是简单的讲到Lambda表达式的语法、使用,使得你对它产生了好感,而Lambda表达式是如何实现、定义,你可能不太清楚。本篇将会详细介绍函数式接口,让你在使用JDK新特性时,做到心中有数,自信满满。
xcbeyond
2020/05/31
1.1K0
JDK1.8新特性(四):函数式接口
jdk8函数接口
java8 新特性推出的 Lambda 表达式,即函数式编程,相信很多开发胸弟都会使用了,但是什么是函数式编程呢?别问我,我也不知道标准的定义。其核心思想是:使用不可变值和函数,函数对一个值进行处理,映射成另一个值。
GreizLiao
2020/03/03
6900
深入探寻JAVA8 part2:浅谈几个内置的函数式接口
函数式接口就是只定义一个抽象方法的接口。在JAVA8以前,就有很多符合函数式接口定义的接口。
眯眯眼的猫头鹰
2019/10/15
5290
Lamda 表达式作用域和内置函数式接口
但是和匿名对象不同的是,这里的变量 num 可以不用声明为 final,该代码同样正确:
happyJared
2019/07/31
5730
Function接口的使用,对系统设计很大帮助
Java8 添加了一个新的特性Function,顾名思义这一定是一个函数式的操作。我们知道Java8的最大特性就是函数式接口。所有标注了@FunctionalInterface注解的接口都是函数式接口,具体来说,所有标注了该注解的接口都将能用在lambda表达式上。
架构师修炼
2021/01/05
9220
Java的函数式接口以及Lambda表达式
在java中,大家肯定使用过lambda表达式吧,这是适用于函数式接口的一种便捷写法。
半月无霜
2023/03/03
4820
Java的函数式接口以及Lambda表达式
Lamda 表达式作用域(Lambda Scopes)
但是和匿名对象不同的是,这里的变量num可以不用声明为final,该代码同样正确:
崔笑颜
2020/06/08
5710
相关推荐
图解jdk1.8新特性(2)---Lambda
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档