Java函数式编程

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;

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

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

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

相关文章

【用法总结】无障碍AccessibilityService

一、背景 本文仅用于做学习总结&#xff0c;转换成自己的理解&#xff0c;方便需要时快速查阅&#xff0c;深入研究可以去官网了解更多&#xff1a;官网链接点这里 之前对接AI语音功能时&#xff0c;发现有些按钮&#xff08;或文本&#xff09;在我没有主动注册唤醒词场景…

Minio安装及整合SpringBoot

一. MinIO概述 官网地址&#xff1a;https://minio.org.cn MinIO是一款基于Apache License v2.0开源协议的分布式文件系统&#xff08;或者叫对象存储服务&#xff09;&#xff0c;可以做为云存储的解决方案用来保存海量的图片、视频、文档等。由于采用Golang实现&#xff0c;服…

细说JavaScript语句详解

一、顺序结构 二、表达式语句 三、声明语句 四、条件语句 1、if语句 2、if…else语句 3、else if语句 4、switch语句 五、循环语句 1、while循环 2、do… while循环 3、for循环 4、for…in循环 六、跳出语句 1、label语句 2、break语句 3、continue语句

Day26 669修剪二叉搜索树 108有序数组转为二叉搜索树 538二叉搜索树转换为累加树

669 修剪二叉搜索树 给定一个二叉搜索树&#xff0c;同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[L, R]中 (R>L) 。你可能需要改变树的根节点&#xff0c;所以结果应当返回修剪好的二叉搜索树的新的根节点。 class Solution { pub…

对闭包的理解

概念&#xff1a; 一个函数对周围状态的引用捆绑在一起&#xff0c;闭包让开发者可以从内部函数访问外部 函数的作用域 简单理解&#xff1a;闭包 内层函数 外层函数的变量 一个函数对周围状态的引用捆绑在一起&#xff0c;闭包让开发者可以从内部函数访问外部 函数的作…

数据结构——顺序二叉树——堆

1.树的相关概念 在介绍二叉树之前&#xff0c;我们首先要明确树是什么。 树用我们的通常认识来判断应该是一种植物&#xff0c;从根向上生长&#xff0c;分出许多的树枝并长出叶子。对于数据结构中的树而言&#xff0c;其结构也正是从树的特征中剥离出来的。树结构是一种非线性…

第二百六十六回

文章目录 1. 概念介绍2. 分析与解决2.1 分析问题2.2 解决方案 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何修改CircleAvatar的大小"相关的内容&#xff0c;本章回中将介绍如何修改StatusBar中文字的颜色.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1.…

Mongodb的危险操作delete

前言 经常听到各种有趣的新闻&#xff0c;程序员对老板不满&#xff0c;一怒之下删库跑路。或某大厂误操作&#xff0c;把关键数据表删除导致业务停滞几个小时。删库和删表&#xff0c;都是很危险的操作&#xff0c;执行前需要谨慎。否则&#xff0c;轻则需要数据恢复&#xf…

深入理解JVM虚拟机第三十八篇:JVM中OOM的说明和举例

😉😉 欢迎加入我们的学习交流群呀! ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring、Security、Docker、Grpc、消息中间件、Rpc、SpringCloud等等很多应用和源码级别高质量视频和笔记资料,你想学的我们这里都有! 🥭🥭3:…

【笔记】书生·浦语大模型实战营——第四课(XTuner 大模型单卡低成本微调实战)

【参考&#xff1a;tutorial/xtuner/README.md at main InternLM/tutorial】 【参考&#xff1a;(4)XTuner 大模型单卡低成本微调实战_哔哩哔哩_bilibili-【OpenMMLab】】 总结 学到了 linux系统中 tmux 的使用 了解了 XTuner 大模型微调框架的使用 pth格式参数转Hugging …

C++学习笔记——SLT六大组件及头文件

目录 一、C中STL&#xff08;Standard Template Library&#xff09; 二、 Gun源代码开发精神 三、 实现版本 四、GNU C库的头文件分布 bits目录 ext目录 backward目录 iostream目录 stdexcept目录 string目录 上一篇文章&#xff1a; C标准模板库&#xff08;STL&am…

原生js实现拖拽效果

<!DOCTYPE html> <html> <head> <style> #mydiv { width: 200px; height: 200px; background-color: red; position: absolute; cursor: move; } </style> | </head> <body> <div id"mydiv">拖拽我…

什么是信噪比

大家好&#xff0c;今天给大家介绍什么是信噪比&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 “信噪比”是电子技术中经常用到的一个词组&#xff0c;知道它的确切含义有一定意…

vivado18.3和modelsim关联

版本关系 首先明确Modelsim与Vivado的联合仿真需要版本号相匹配&#xff0c;Xilinx官方文档UG973中给出了所有版本的Vivado兼容Modelsim的版本情况 Vivado版本号Modelsim版本号Vivado Design Suite 2022.2Mentor Graphics ModelSim DE (2022.2)Vivado Design Suite 2022.1Men…

【前端性能优化】如何取消http请求

文章目录 需要取消http请求的3种经典场景原生XMLHttpRequest取消http请求fetch取消http请求axios取消http请求哪些情况需要取消HTTP请求取消http请求能带来哪些性能提升 需要取消http请求的3种经典场景 场景一&#xff1a;有一个实时搜索功能&#xff0c;每当用户输入内容改变的…

app开发——安卓native开发思路记录

我们知道app开发目前有三种方式&#xff0c;第一种是webapp&#xff0c;第二种是hybird app&#xff0c;第三种是native app。 而native-app就是安卓原生app&#xff0c;这里记录一下安卓原生开发的基本思路。 首先&#xff0c;安卓原生开发虽然在当今时代不是那么常见了&…

python爬虫小练习——爬取豆瓣电影top250

爬取豆瓣电影top250 需求分析 将爬取的数据导入到表格中&#xff0c;方便人为查看。 实现方法 三大功能 1&#xff0c;下载所有网页内容。 2&#xff0c;处理网页中的内容提取自己想要的数据 3&#xff0c;导入到表格中 分析网站结构需要提取的内容 代码 import requests…

[NAND Flash 6.6] NAND FLASH Multi Plane Program(写)操作_multi plane 为何能提高闪存速度

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< Multi Plane 简介 Multi Plane Program 时序图 Multi Plane 提速机理 Multi Plane Program 状态检查 前言 上一篇我们介绍了 NAND FLASH基本编程(写)…

【昕宝爸爸小模块】线程的几种状态,状态之间怎样流转

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…

vue中动态给不同表单赋值

这里的业务是通过关联的 id 发送不同的请求获取表单的数据&#xff0c;然后回显到页面中&#xff0c;整个的页面是由多个表单拼接起来的 点击下一步的时候&#xff0c;获取下一个表单的内容。 // 查询getForm(index) {switch (index) {case 0:this.getFromInfo("inputFor…