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

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

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

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

博客目录

    • 一.基本介绍
      • 1.什么是函数式接口?
      • 2.函数式接口的定义?
      • 3.常用的函数式接口
    • 二.Consumer
      • 1.Consumer 介绍
      • 2.Consumer 使用
      • 3.Consumer 参数传递
    • 三.Supplier
      • 1.什么是 Supplier?
      • 2.获取随机数
      • 3.安全的 DateFormat

一.基本介绍

1.什么是函数式接口?

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

2.函数式接口的定义?

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

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

@FunctionalInterface
interface 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<T>):接受一个输入参数,但不返回结果,通常用于执行某些操作。
  2. Supplier (java.util.function.Supplier<T>):表示一个供应商,它不接受参数,但返回一个值。在函数式编程中,常用于延迟计算或提供初始值。
  3. Function (java.util.function.Function<T, R>):表示一个函数,它接受一个参数类型为 T 的对象,然后返回一个类型为 R 的结果对象。
  4. Predicate (java.util.function.Predicate<T>):表示一个断言,它接受一个参数类型为 T 的对象,返回一个布尔值,用于判断对象是否满足某个条件。
  5. UnaryOperator (java.util.function.UnaryOperator<T>):是一个特殊的 Function,输入和输出类型都是相同的。用于表示只接受一个参数并返回相同类型结果的操作。
  6. BinaryOperator (java.util.function.BinaryOperator<T>):是一个特殊的 Function,输入和输出类型都是相同的。用于表示接受两个参数并返回一个相同类型结果的操作。
  7. BiFunction (java.util.function.BiFunction<T, U, R>):与 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 接口的定义:

@FunctionalInterface
public 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 是一个代表生产(提供)数据的函数式接口。它不接受任何参数,但返回一个值。它的声明如下:

@FunctionalInterface
public 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 对象

//创建线程安全的DateFormat
public 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/255840.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用Docker本地搭建开源CMF Drupal并结合内网穿透公网访问

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS&#xff0c;适用于各种不同的网站项目&#xff0c;从小型个人博客到大型企业级门户网站。它的学习…

业绩超预期,股价却暴跌,MongoDB股票还值得投资吗?

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 尽管MongoDB(MDB)本季度的财报超出了预期&#xff0c;并提高了全年预期&#xff0c;但它的股价在财报发布后还是出现了暴跌。 MongoDB截至2023年10月31日的第三财季&#xff0c;收入同比增长了30%&#xff0c;达到了4.329亿…

HXDSP2441-地址空间转换

地址空间转换 地址空间本身很简单&#xff0c;但由于HXDSP2441同时有DSP核和CPU核&#xff0c;且二者寻址方式不同&#xff0c;导致编程中会有歧义。 DSP核采用字地址编址方式&#xff0c;CPU核和总线空间内都采用字节地址编址方式&#xff0c;而且文档中所涉及的所有寄存器地…

选择更好的Notes索引附件方式

大家好&#xff0c;才是真的好。 首先介绍最近产品更新消息。在上一周&#xff0c;HCL主要发布了以下几个产品更新&#xff1a;HCL Verse 3.2.0、HCL Volt MX Go 2.0.2、HCL Domino Rest API 1.0.8。 HCL Verse是今后Domino的产品当中主要使用的webmail功能&#xff0c;这一次…

【数据结构】手撕排序

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、排序的概念及其运用1.1 排序的概念1.2 常见的算法排序 二、 冒泡排序三、直接插入排…

考试与评价杂志考试与评价杂志社考试与评价编辑部2023年第11期目录

直击中高考 新高考背景下高中英语复习优化教学策略 何永翠1-3 中考英语阅读试题分析与备考策略 乔思4-6《考试与评价》投稿&#xff1a;cn7kantougao163.com 基于中考视角 优化词汇复习 郑敏婧7-9 以教促考 初中英语主谓一致三原则解析 龚海仙10-12 初中英语教育中的口语交流能…

AI交互数字人如何创新文旅景区新体验?

在数实融合技术推动以及国家文化数字化战略的深入实施&#xff0c;文旅产业逐渐融入AI交互数字人技术&#xff0c;通过在文旅景区布局AI交互数字人&#xff0c;以此为数字文旅带来了更多活力和可能。 *图片源于网络 如江西南昌滕王阁基于南昌市提升旅游城市地位并扩大影响的需求…

RHEL8---vim编辑器的使用

本章主要介绍如何使用vim编辑文件 vim 的基本使用vim 几种模式的切换vim 在末行模式中的用法vim 在命令模式中的用法 在Linux中&#xff0c;很多时候需要使用编辑器来修改文件&#xff0c;使用最多的编辑器就是vim,用法如下。 vim /path/file 如果这个文件不存在&#xff0c;…

读者和写者问题

它可以解决的问题&#xff1a; 可以支持多个读者访问&#xff0c;通过count计数 来实现多个读者访问的时候是互斥的&#xff0c;不会出现不符合进程同步的问题&#xff1a;设置mutex互斥锁&#xff0c;保证count或count--和if Pv(mutex)是一气呵成的 读写公平&#xff0c;通过…

elk(filebeat)日志收集工具

elk&#xff08;filebeat&#xff09;日志收集工具 elk&#xff1a;filebeat日志收集工具 和logstash相同 filebeat是一个轻量级的日志收集工具&#xff0c;所使用的系统资源比logstash部署和启动时使用的资源要小得多 filebeat可以运行在非Java环境。他可以代理logstash在…

LinuxBasicsForHackers笔记 -- 进程管理

进程是一个正在运行和使用资源的程序。 Linux 内核是操作系统的内核&#xff0c;几乎控制着一切&#xff0c;在创建进程时&#xff0c;它会按顺序为每个进程分配一个唯一的进程 ID (PID)。 查看进程 ps – 用于在命令行查看哪些进程处于活动状态。单独使用 ps 命令并不能真正…

SSL证书代理

众所周知&#xff0c;SSL证书已经成为当下网络安全中不可或缺的一个环节&#xff0c;对于很多开发公司来说&#xff0c;给自己的客户提供SSL证书安全服务也是最为基础的。 但是目前市面上像阿里云之类的证书服务商对于开发公司需要的证书并没有太大的一个优惠政策&#xff0c;给…