文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【Java系列】函数式接口编程

2023-12-23 07:07

关注

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
    • 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

一.基本介绍

1.什么是函数式接口?

在 Java 中,函数接口通常指的是函数式接口(Functional Interface)。函数式接口是 Java 8 引入的一个特性,它是一个只包含一个抽象方法的接口。函数式接口的主要目的是支持 Lambda 表达式和方法引用,使得函数式编程更加容易和方便。

2.函数式接口的定义?

函数式接口有一个特殊的注解 @FunctionalInterface,用来标识该接口是一个函数式接口。如果一个接口使用了 @FunctionalInterface 注解,并且不满足函数式接口的条件(拥有多个抽象方法),编译器将会报错。

以下是一个简单的函数式接口示例:

@FunctionalInterfaceinterface MyFunction {    int apply(int a, int b);}

在上面的示例中,MyFunction 是一个函数式接口,因为它只有一个抽象方法 apply

你可以使用 Lambda 表达式或方法引用来实现函数式接口的实例,例如:

MyFunction add = (a, b) -> a + b;MyFunction subtract = (a, b) -> a - b;

3.常用的函数式接口

以下是一些常用的函数式接口:

  1. Consumer(java.util.function.Consumer):接受一个输入参数,但不返回结果,通常用于执行某些操作。
  2. Supplier (java.util.function.Supplier):表示一个供应商,它不接受参数,但返回一个值。在函数式编程中,常用于延迟计算或提供初始值。
  3. Function (java.util.function.Function):表示一个函数,它接受一个参数类型为 T 的对象,然后返回一个类型为 R 的结果对象。
  4. Predicate (java.util.function.Predicate):表示一个断言,它接受一个参数类型为 T 的对象,返回一个布尔值,用于判断对象是否满足某个条件。
  5. UnaryOperator (java.util.function.UnaryOperator):是一个特殊的 Function,输入和输出类型都是相同的。用于表示只接受一个参数并返回相同类型结果的操作。
  6. BinaryOperator (java.util.function.BinaryOperator):是一个特殊的 Function,输入和输出类型都是相同的。用于表示接受两个参数并返回一个相同类型结果的操作。
  7. BiFunction (java.util.function.BiFunction):与 Function 类似,但接受两个参数类型分别为 TU 的对象,然后返回一个类型为 R 的结果对象。
  8. Consumer 接口的变种: 除了常规的 Consumer,还有 IntConsumerLongConsumerDoubleConsumer 分别用于处理整数、长整数和双精度浮点数。

这些函数式接口可以通过 Java 8 中的 java.util.function 包来使用,它们在函数式编程和 Lambda 表达式的应用中非常有用,可以让代码更加简洁和易于理解。

二.Consumer

1.Consumer 介绍

Consumer 可以在函数式编程中的很多场景中使用,例如遍历集合并执行某种操作,执行异步任务的回调等。

是的,除了 Consumer,Java 8 引入了一系列函数式接口,用于支持不同类型的函数式操作。

在 Java 8 中,Consumer 是一个函数式接口,它定义了一个接受一个参数并且不返回任何结果的操作。它在函数式编程中常用于表示一个可以对传入的参数执行某种操作的函数。

Consumer 接口中的抽象方法是 accept(T t),其中 T 是输入参数的类型。下面是 Consumer 接口的定义:

@FunctionalInterfacepublic interface Consumer<T> {    void accept(T t);    // 其他默认方法和静态方法省略}

函数式接口的注解 @FunctionalInterface 表示该接口是一个函数式接口,即只包含一个抽象方法。这样的接口可以使用 Lambda 表达式来实例化。

Consumer 接口有一个抽象方法 accept(T t),该方法接受一个参数类型为 T 的对象,并对该对象进行操作,但不返回任何结果。

“Consumer” 是 Java 中的一个函数式接口,它属于 Java.util.function 包。函数式接口是指只包含一个抽象方法的接口。Consumer 接口表示一个接受单个输入参数并且不返回结果的操作。它通常用于接受某个对象,并对其执行一些操作,比如修改对象的状态或者打印信息。

2.Consumer 使用

下面是 Consumer 的简单示例:

import java.util.function.Consumer;public class ConsumerExample {    public static void main(String[] args) {        // 使用 Consumer 打印字符串        Consumer<String> printConsumer = str -> System.out.println(str);        printConsumer.accept("Hello, world!");        // 使用 Consumer 修改集合中的元素        List<String> names = new ArrayList<>();        names.add("Alice");        names.add("Bob");        names.add("Charlie");        Consumer<List<String>> modifyConsumer = list -> {            for (int i = 0; i < list.size(); i++) {                list.set(i, list.get(i).toUpperCase());            }        };        modifyConsumer.accept(names);        System.out.println(names); // 输出: [ALICE, BOB, CHARLIE]    }}

在上面的示例中,我们创建了两个不同的 Consumer 实例,一个用于打印字符串,另一个用于将集合中的元素转换为大写。accept 方法负责执行相应的操作。

3.Consumer 参数传递

import java.util.Arrays;import java.util.List;public class ConsumerExample {    public static void main(String[] args) {        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");        // 使用 Consumer 接口打印每个名字        names.forEach(name -> {            Consumer<String> printName = s -> System.out.println(s);            printName.accept(name);        });    }}

上述代码使用了 forEach 方法,将 Consumer 接口作为参数传递,以打印每个名字。Lambda 表达式使得代码更为简洁和易读。

三.Supplier

1.什么是 Supplier?

“Supplier” 是 Java 编程语言中的一个函数式接口(Functional Interface)。在 Java 8 中引入了函数式编程的特性,为了支持这一特性,引入了一些新的函数式接口,其中 Supplier 就是其中之一。

在函数式编程中,函数是一等公民,这意味着可以将函数作为参数传递给其他函数,也可以从函数中返回函数。Supplier 是一个代表生产(提供)数据的函数式接口。它不接受任何参数,但返回一个值。它的声明如下:

@FunctionalInterfacepublic interface Supplier<T> {    T get();}

这里,T 是返回值的类型。get 方法不接受任何参数,但返回类型为 T 的值。

2.获取随机数

使用 Supplier 的一个例子是延迟计算,其中某个值只有在需要的时候才会被计算。例如:

import java.util.function.Supplier;public class SupplierExample {    public static void main(String[] args) {        // 使用 Supplier 创建一个延迟计算的值        Supplier<Double> randomSupplier = () -> Math.random();        // 获取值        double randomValue = randomSupplier.get();        System.out.println("Random value: " + randomValue);    }}

在上面的例子中,randomSupplier 是一个 Supplier,它在调用 get 方法时返回一个随机的 double 值。这样,我们可以在需要随机值的地方调用 get 方法。

函数式接口的引入使得在 Java 中更容易进行函数式编程,带来了更简洁、灵活的代码编写方式。

3.安全的 DateFormat

创建 ThreadLocal 对象

//创建线程安全的DateFormatpublic final static ThreadLocal<DateFormat> formatter = withInitial(() -> new SimpleDateFormat("dd-MMM-yyyy"));

源码:

//可以看到参数是Supplier,表示不要参数,返回一个值public static <S> ThreadLocal<S> withInitial(Supplier<? extends S> supplier) {    return new SuppliedThreadLocal<>(supplier);}

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

来源地址:https://blog.csdn.net/qyj19920704/article/details/134855117

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯