Java学习笔记-day04-函数式编程

0.Java函数式编程

  • 使用函数式接口Lambda表达式Stream API方法引用编写的代码即为函数式编程

1.函数式接口

  • 只包含一个抽象方法
  • 可以有默认方法
  • 可以有静态方法

函数式接口(Functional Interface)是指仅包含一个抽象方法的接口。函数式接口是Java中支持函数式编程的关键概念之一。函数式编程强调的是将计算视为数学函数的求值,并避免程序状态的改变。Java 8引入了Lambda表达式和函数式接口的概念,以更方便地支持函数式编程。
函数式接口具有以下特点:

  1. 只包含一个抽象方法: 函数式接口只能包含一个抽象方法。这个抽象方法定义了接口的行为,而其他非抽象方法可以有多个。
  2. 可以有默认方法: 除了唯一的抽象方法外,函数式接口可以包含多个默认方法。默认方法在接口中已经有默认的实现,但仍然可以被子类覆盖。
  3. 可以有静态方法: 函数式接口还可以包含静态方法。这些方法在接口级别上是静态的,不依赖于接口的实例。
@FunctionalInterface //加上该注解,若接口不符合函数式接口的定义,编译器会产生错误interface MyInterface {//抽象方法int sum(int i, int j);//静态方法default int defaultSum(int i, int j){return i + j;}//默认方法static int staticSum(int i, int j){return i + j;}}

2.Lambda表达式

  • 格式:(参数表) -> {方法体}
  • Lambda表达式可简化函数式接口实例的创建
  • 该格式实际为映射到函数式接口的抽象方法上
public static void main(String[] args) {//2.MyInterface的实现类实例,通过匿名内部类创建MyInterface myInterface = new MyInterface() {@Overridepublic int sum(int i, int j) {return i+j+1;}};//2.Lambda表达式简化函数式接口实例的创建//格式:(参数表) -> {方法体}//该格式实际为映射到函数式接口的抽象方法 sum()MyInterface myInterfaceLambda = (i, j) ->{return i+j+1;} ;System.out.println("myInterface.sum(3,4) = " + myInterface.sum(3, 4));System.out.println("myInterfaceLambda.sum(3,4) = " + myInterfaceLambda.sum(3, 4));}

3.Stream API

  • Stream 是处理集合数据的工具,可以对数据集合进行各种转换、过滤、映射等操作
  • 整个流程可以被概括为“创建 -> 中间操作 -> 终端操作”
    • 在终端操作执行之前,中间操作是惰性的(通过回调执行),不会立即执行。
    • 中间操作的方法参数为回调函数
    • 中甲操作和终端操作的执行顺序是交替执行的
    public static void main(String[] args) {List<String> myList = Arrays.asList("5555", "1", "333", "22", "4444");myList.stream().filter(s -> {System.out.println("filter s = " + s); //【回调函数】if (s.length() < 3) {System.out.println("filter 收集到数据了");} else {System.out.println("filter 没有收集到数据了");}return s.length() < 3;}).map((Function<String, Object>) s -> {System.out.println("map s = " + s); //【回调函数】return s.toUpperCase();}).forEach(s -> {System.out.println("forEach s = " + s); //【回调函数】});}

Stream流中大量使用是函数式接口作为方法参数,因此,Lambda表达式在Stream流中大量使用

输出结果:

  • 中间操作和终端操作是交替执行的
  • 中间操作获取到一项数据后才会往后执行

filter s = 5555
filter 未收集到数据
filter s = 1
filter 收集到数据了!!!
map s = 1
forEach s = 1
filter s = 333
filter 未收集到数据
filter s = 22
filter 收集到数据了!!!
map s = 22
forEach s = 22
filter s = 4444
filter 未收集到数据

4.方法引用

简化Lambda表达式的编写,那么实质也是一个函数式接口

方法引用种类

  • 静态方法引用
  • 实例方法引用(无用,多此一举)
  • 类方法引用
  • 构造方法引用
        //静态方法引用: 引用类的静态方法//格式:类名::静态方法// Lambda表达式Function<Integer, String> lambdaStatic =  x -> Long.toString(x);// 静态方法引用Function<Integer, String> referenceStatic = Long::toString;//实例方法引用: 引用特定对象的实例方法//格式:实例::成员方法//和类方法引用的区别:目前来看,一个是无参函数,一个是有参函数。//实例方法引用应该很少用,多此一举的操作。可以直接用实例调用该方法就获取到结果,所以实例方法引用结果也是固定的,// Lambda表达式String str = "Hello";Supplier<Object> lambdaInstance = () -> str.toUpperCase();// 实例方法引用Supplier<String> referenceInstance = str::toUpperCase;//类方法引用:引用类的成员方法//格式:类名::成员方法// Lambda表达式Function<String, String> lambdaClass = s -> s.toUpperCase();// 类方法引用Function<String, String> referenceClass = String::toUpperCase;//构造方法引用: 引用类的构造方法。// Lambda表达式Supplier<List<String>> lambdaStructure = () -> new ArrayList<>();// 构造方法引用Supplier<List<String>> referenceStructure = ArrayList::new;

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

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

相关文章

【Python】对比嵌套JSON的不同

前言 此对比默认json arry中的顺序相同&#xff0c;在Python中即list中出现的顺序相同。将结果保存在对应的xx_ret中。 import json import os import string# 保存不同的字段 different_ret [] # 保存缺失的字段 lack_ret [] # 保存额外的字段 extra_ret []# 保存do_check…

LeetCode刷题12:贪心算法解决1402.做菜顺序

一个厨师收集了他 n 道菜的满意程度 satisfaction &#xff0c;这个厨师做出每道菜的时间都是 1 单位时间。 一道菜的 「 like-time 系数 」定义为烹饪这道菜结束的时间&#xff08;包含之前每道菜所花费的时间&#xff09;乘以这道菜的满意程度&#xff0c;也就是 time[i]*sa…

LeetCode 447. 回旋镖的数量,枚举+哈哈希

一、题目 1、题目描述 给定平面上 n 对 互不相同 的点 points &#xff0c;其中 points[i] [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 &#xff0c;其中 i 和 j 之间的距离和 i 和 k 之间的欧式距离相等&#xff08;需要考虑元组的顺序&#xff09;。 返回平面上所有回…

一文6个步骤带你实现接口测试入门

一、接口测试概述 1 什么是接口测试&#xff1a; 接口测试是测试系统组件间交互的一种测试。接口测试主要用于检测外部系统与系统之间&#xff0c;内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依…

SpringBoot+Prometheus+Grafana搭建应用监控系统

1.应用监控系统介绍 SpringBoot的应用监控方案比较多&#xff0c;SpringBootPrometheusGrafana是比较常用的一种解决方案&#xff0c;主要的监控数据的处理逻辑如下&#xff1a; SpringBoot 的 actuator 提供了应用监控端点&#xff0c;可以对外暴露监控数据信息。Prometheu…

C++深入学习之模板

为什么需要模板 先来看下面一段程序&#xff1a; int add(int x, int y) {return x y; }double add(double x, double y) {return x y; }long add(long x, long y) {return x y; }string add(string x, string y) {return x y; }//T1 T2 T3 T3 add(T1 x, T2 y) {return…

服务降级和熔断的区别

搜了几篇网上的回答&#xff0c;感觉都说的不是太清楚全面&#xff0c;在这里总结一下&#xff0c;方便后人查阅学习&#xff1a; 目的不同&#xff1a; 服务降级的主要目的是在面对异常情况时保障系统的可用性&#xff0c;通过减少非核心功能或服务的质量来维持核心功能的运行…

基于OpenCV的图像缩放

基础概念 缩放是将图像的尺寸变小或变大的过程&#xff0c;即减少或增加原图像数据的像素个数&#xff0c;或者说通过增加或删除像素点来改变图像的尺寸&#xff1b; 基本原理&#xff1a;将分辨率&#xff08;图片尺寸&#xff09;为(w,h)的图像&#xff0c;缩放后其图像分辨…

jvm虚拟机初识

JVM Java虚拟机就是二进制字节码的运行环境&#xff0c;负责装载字节码到其内部&#xff0c;解释/编译为对应平台上的机器指令执行。每一条Java指令&#xff0c;Java虚拟机规范中都有详细定义&#xff0c;如怎么取操作数&#xff0c;怎么处理操作数&#xff0c;处理结果放在哪…

服务器监控软件夜莺使用(二)

文章目录 一、采集器安装1. Categraf简介2. Categraf部署3. 测试服务器部署4. 系统监控插件5. 显卡监控插件6. 服务监控插件 二、监控仪表盘1. 机器列表2. 系统监控3. 服务监控 三、告警配置1. 邮件通知2. 告警规则3. 告警自愈 一、采集器安装 1. Categraf简介 Categraf 需要…

【shell发送邮件】

一、centos系统 mail sendmail发送 安装mail [rootlocalhost ~]# yum install -y mailx安装sendmail [rootlocalhost ~]# yum install -y sendmail配置mail.rc文件 # 发送人&#xff0c;必须和发件人保持一致 set from769593qq.com # 邮箱服务器 set smtpsmtp.qq.com # 邮箱…

聚道云软件连接器助力某贸易公司实现付款流程自动化

客户介绍&#xff1a; 某贸易公司是一家集进出口贸易、国内贸易、电子商务等业务于一体的综合性贸易企业。公司业务遍及全球多个国家和地区&#xff0c;拥有庞大的供应商网络和采购需求。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 客户痛点&#…

【2023开发组特等奖】“立体融合,都市智行”——城市公交时空感知分析及运营优化系统

作品介绍 1 需求分析 1.1 设计背景 作为满足人民群众基本出行需求的社会公益性事业,公共交通是城市功能正常运转的基础支撑。目前,中国的城市公共交通发展迅速,实现了从常规公交运营模式向多元公交运营模式发展的新转变,在一定程度上丰富了用户的出行选择,改善了乘客出行…

CAN转RS232学习笔记

2024-1-9 用keil打开工程后&#xff0c;打开main.c文件 报错&#xff1a;error in include chian 网络解决方法&#xff1a; KEIL消除警告&#xff1a;error in include chain(cmsis_armcc.h):expected identifier or ‘(‘-CSDN博客 上文链接包含的链接&#xff08;套娃&am…

前端JS加密对抗由浅入深-2

前言&#xff1a; 本文主要讲解&#xff0c;针对前端非对称、多段加密数据传输站点&#xff0c;如何进行动态调试&#xff0c;如何进行安全测试。本次讲解不涉及任何漏洞方面&#xff0c;仅为学习探讨&#xff0c;该站点现已经更改加密方式&#xff0c;严禁非法测试&#xff0…

如何使用内网穿透实现iStoreOS软路由公网远程访问局域网电脑桌面

文章目录 简介一、配置远程桌面公网地址二、家中使用永久固定地址 访问公司电脑**具体操作方法是&#xff1a;** 简介 软路由是PC的硬件加上路由系统来实现路由器的功能&#xff0c;也可以说是使用软件达成路由功能的路由器。 使用软路由控制局域网内计算机的好处&#xff1a…

一文弄懂SpringCloud Stream

目录 SpringCloud StreamSpringCloud Stream相关概念SpringCloud Stream使用 SpringCloud Stream Spring Cloud Stream 是一个构建消息驱动微服务的框架&#xff0c;Spring Cloud Stream 提供了一个抽象层&#xff0c;屏蔽了不同消息中间件之间的差异&#xff0c;使得开发人员…

Java学习笔记-day05-响应式编程初探-自定义实现Reactive Streams规范

最近在学响应式编程&#xff0c;这里先记录下&#xff0c;响应式编程的一些基础内容 1.名词解释 Reactive Streams、Reactor、WebFlux以及响应式编程之间存在密切的关系&#xff0c;它们共同构成了在Java生态系统中处理异步和响应式编程的一系列工具和框架。 Reactive Streams…

3D人体姿态估计

3D人体姿态估计是指通过算法对输入的图像或视频进行分析&#xff0c;推断出人体的三维姿态信息。该技术可以应用于许多领域&#xff0c;如虚拟现实、运动分析、人机交互等。 1. 算法原理&#xff1a; 3D人体姿态估计利用深度学习模型作为算法的核心&#xff0c;通过网络学习人…

html js加载本地文件报错处理,跨域问题

这个问题是怎么来的&#xff1f;我写了一个本地html文件&#xff0c;里面通过three.js加载并显示一个本地三维模型&#xff0c;结果报错了。 报错如下&#xff1a; Access to XMLHttpRequest at file:///C:/model/quater.mtl from origin null has been blocked by CORS poli…