Java8 函数式编程【基础篇】

news/2024/5/15 2:36:20/文章来源:https://blog.csdn.net/qq_35808136/article/details/128128753

        Java 8是Java在保持向后兼容的前提下首次迈出重要一步,相比之前,不再是只对类库的改良,在编写复杂的集合处理、并行化执行、代码简洁度等方面都有颠覆性的提升。本文将探索和理解函数式编程的含义,以及它在Java 8中的实现。

一、理解函数式编程

        Java倡导“一切皆对象”,面向对象编程(OOP)是对数据进行抽象,主要抽象类/对象,是命令式编程风格。而函数式编程(OOF)是对行为进行抽象,主要是抽象函数,是声明式编程风格,其核心是:在思考问题时,使用不可变值和函数,函数对一个值进行处理,映射成另一个值。

二、Java 8 为实现函数式编程提供的支持

1、Lambda表达式

定义:本质上是一段匿名内部类,也可以是一段可以传递的代码(将代码像数据一样进行传递)。

作用:使代码更简洁、更灵活、更紧凑。

语法:()->();

口诀:左右遇一省括号,左侧推断类型省

/** case1-表达式不包含参数 */
Runnable noArguments = () -> System.out.println("Hello Word");/** case2-表达式只有一个参数 */
Consumer tConsumer = evnet -> System.out.println("Hello Word");/** case3-表达式的主体是一段代码块 */
Runnable multiStatement = () -> {System.out.printf("Hello");System.out.println(" Word");
};/** case4-表达式有多个参数 */
BinaryOperator<Long> addFun = (x, y) -> x + y;/** case5-显示声明表达式参数类型,而非编译器推断 */
BinaryOperator<Long> addExplicit = (Long x, Long y) -> x + y;

2、引用

作用:是Lambda表达式的另外一种表现形式,且语法比Lambda表达式更加简单

类型:

  • 方法引用[对象-实例方法、类-静态方法、类-实例方法]:ClassName::monthod

  • 构造器引用:ClassName::new

  • 数组引用:Type[]::new

/** 方法引用-ClassName::monthod */
Consumer<String> consumer = System.out::println;
// 方法引用-类名::静态方法名
BiFunction<Integer, Integer, Integer> biFunction = Integer::compare;
biFunction.apply(10, 20);
// 方法引用-类名::实例方法名
BiFunction<String, String, Boolean> booleanBiFunction = String::equals;
booleanBiFunction.apply("hello", "hello");/** 构造器引用:ClassName::new */
Supplier<LambdaDemo> supplier = LambdaDemo::new;/** 数组引用 Type[]::new */
Function<Integer, String[]> function = String[]::new;
function.apply(10);

3、类型推断

        在Lambda 表达式中无需指定类型,程序依然可以编译,由编译器根据程序的上下文推断出来,这就是所谓的“类型推断”。实际上是Java 7中引入的目标类型推断(菱形操作符)的扩展。

4、函数式接口

定义:函数接口是只有一个抽象方法的接口,使用只有一个方法的接口来表示某特定方法并反复使用,是一种表示函数的方式。任何需要函数式接口的地方,我们都可以使用Lambda表达式(或方法引用)。

作用:为了给Lambda表达式的使用提供更好的支持,不需要自己再手动创建一个函数式接口,直接拿来用就好了。

使用:

  • 自定义函数式接口:在接口上标注@FunctionalInterface 注解。

  • java.util.function包下定义了Java 8提供的函数式接口,可直接使用。

/*** 核心函数式接口*/
// Consumer
Consumer<String> consumer = str -> System.out.println(str);
consumer.accept("Consumer-消费型,有入参无返回");
// Supplier
Supplier<String> supplier = () -> "Supplier-供给型,无入参有返回";
System.out.println(supplier.get());
// Function
Function<Integer, String> function = integer -> {if (integer > 0) {return "入参大于0";}return "入参小于等于0";
};
System.out.println("Function-函数市接口,有入参有返回" + function.apply(-10));
// Predicate
Predicate<Integer> predicate = integer -> integer < 10;
System.out.println("Predicate-断言型接口,有入参有返回" + predicate.test(20));/*** 扩展函数式接口*/
// BiFunction
BiFunction<Integer, Integer, Integer> biFunction = (x, y) -> x * y;
biFunction.apply(2, 2);
类型函数式接口方法
四大核心函数式接口

Consumer<T>

消费型接口

void accept<T t>

Supplier<T>

供给型接口

T get()

Function<T, R>

函数型接口

R apply(T t)

Predicate<T>

断言型接口

boolean test(T t)
Consumer-扩展函数式接口

DoubleConsumer<T>

LongConsumer<T>

IntConsumer<T>

void accept(double value)

void accept(long value)

void accept(int value)

ObjDoubleConsumer<T>

ObjLongConsumer<T>

ObjIntConsumer<T>

void accept(T t, double value)

void accept(T t, long value)

void accept(T t, int value)

Supplier-扩展函数式接口

BooleanSupplier

DoubleSupplier

LongSupplier

IntSupplier

boolean getAsBoolean()

double getAsDouble()

long getAsLong()

int getAsInt()

Function-扩展函数式接口BiFunction<T, U, R>R apply(T t, U u)

DoubleFunction<R>

LongFunction<R>

IntFunction<R>

R apply(double value)

R apply(long value)

R apply(int value)

ToDoubleFunction<T>

ToLongFunction<T>

ToIntFunction<T>

double applyAsDouble(T value)

long applyAsLong(T value)

int applyAsInt(T value)

ToDoubleBiFunction<T, U>

ToLongBiFunction<T, U>

ToIntBiFunction<T, U>

double applyAsDouble(T t, U u)

long applyAsLong(T t, U u)

int applyAsInt(T t, U u)

DoubleToIntFunction

DoubleToLongFunction

int applyAsInt(double value)

long applyAsLong(double value)

LongToDoubleFunction

LongToIntFunction

double applyAsDouble(long value)

int applyAsInt(long value)

IntToDoubleFunction

IntToLongFunction

double applyAsDouble(int value)

long applyAsLong(int value)

Predicate-扩展函数式接口BiPredicate<T, U>boolean test(T t, U u)

DoublePredicate

LongPredicate

IntPredicate

boolean test(double value)

boolean test(long value)

boolean test(int value)

-------------------------------------------------------------------------------------------------------------------------------

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

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

相关文章

全光谱台灯对孩子有伤害吗?儿童用台灯的好处和坏处是什么

全光谱台灯是指灯光色谱丰富度与太阳光一般全面的台灯&#xff0c;这样的灯光照射下的任何物体&#xff0c;不但颜色丰富多彩&#xff0c;而且极其真实&#xff0c;无限接近太阳光下的真实色彩&#xff0c;对人眼舒适度有巨大的提升&#xff0c;所以全光谱台灯不但对孩子无害&a…

【文件I/O】标准IO:库函数

标准IO&#xff1a;库函数一、基本概念1.文件类型2.标准I/O介绍3.流的概念4.文本流和二进制流5.流的缓冲类型6.标准I/O流&#xff08;stdin、stdout、stderr&#xff09;二、标准I/O函数1.fopen、fclose、errrno、strerror、perror&#xff08;打开、关闭文件&#xff0c;输出错…

小程序开发音视频问题汇总及解决方案

目录 问题一&#xff1a;开发音视频&#xff0c;必用的两个小程序组件live-player和live-pusher&#xff0c;他们做什么用的&#xff0c;怎么才能使用&#xff1f; 问题二&#xff1a;一个页面只能插入一个 问题三&#xff1a;真机调试图片预览及视频全屏无反应 问题四&am…

在vue项目中下载swiper出现:Do not use ‘new’ for side effects报错问题

我报错的情况是&#xff1a;我在单文件组件vue文件中使用new Swiper&#xff0c;报了两个错误&#xff0c;图示&#xff1a; 第一个错误是&#xff1a;‘Swiper’ is not defined 第二个错误是&#xff1a;Do not use ‘new’ for side effects 解决办法&#xff1a; &#x…

5G无线技术基础自学系列 | MU-MIMO原理

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 MU-MIMO是指多个用户在上下行数据传输时…

【Linux】命令

常用命令 帮助&#xff08;Manual Pages&#xff0c;Manual&#xff1a;手册&#xff0c;特指参考文件&#xff09; man man <command_name> 打开目录&#xff08;change directory&#xff09; cd /etc/ cd /home 查看当前所在目录 pwd 创建一个名为 file 的文件&…

[附源码]计算机毕业设计JAVA校园共享单车系统

[附源码]计算机毕业设计JAVA校园共享单车系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

二、【React拓展】懒加载 lazy

文章目录1、适用点2、汇总1、适用点 懒加载往往配合路由一起使用&#xff0c;此处修改的项目是 二、【React-Router5】路由的基本使用 中的项目 首先从react中引入lazy import { lazy } from react 修改引入路由组件的写法 // import About from ./pages/About // import Home…

SequoiaDB湖仓一体分布式数据库2022.11月刊

本月看点速览 产品能力再获认可&#xff0c;入围多个榜单、报告 ‍精彩亮相2022沙丘大会湖仓一体专场 实力吸睛&#xff0c;获多家权威媒体关注与报道 生态圈不断扩大&#xff0c;与6家合作伙伴完成互认证 青杉计划2023进行中&#xff0c;一起攀登更高的“杉” 产品能力再获…

pip 安装 livetest 失败

pip 安装 livetest 失败1. 现象2. 解决方案(1) 下载(2) 移动并解压(3) 修改文件1) livetest-0.5/livetest/__init__.py2) livetest-0.5/setup.py3) livetest-0.5/test/test_select.py(4) 运行安装4. 验证1. 现象 pip 安装 livetest 失败 2. 解决方案 (1) 下载 官网下载 liv…

09-13-Hbase-shell入门操作

09-Hbase-shell入门操作&#xff1a; HBase Shell 操作 DDL基本操作 1&#xff0e;进入 HBase 客户端命令行 [roothadoop102 hbase-1.3.1]# bin/hbase shell 2&#xff0e;查看帮助命令 hbase(main):001:0> help 3&#xff0e;查看当前数据库中有哪些表 hbase(main):0…

网页添加灰色滤镜

网页添加灰色滤镜 b站的灰色滤镜 我校的灰色滤镜 CSDN的灰色滤镜 自己调制css主题,给网页加上滤镜. 更快捷的,可以在可以调制css的浏览器插件中加上滤镜,只要开启插件就会自动修改网站滤镜 以darkreader为例打开其开发者工具 *INVERT .jfk-bubble.gtx-bubble .captcheck_a…

ABAP CLEAR REFRESH FREE 说明(刘欣)

本文仔细测试总结了ABAP中的clear、refresh、free&#xff0c;因为很多时候程序的BUG就是出现在变量没有清理干净&#xff0c;希望整理一个定式出来以后少出BUG。 用clear、refresh、free对带表头的表执行的测试结果如下表&#xff1a; 看起来&#xff0c;最好的避免这些清空命…

总结:SpringBoot内嵌Tomcat原理

一、介绍 一般我们启动web服务都需要单独的去安装tomcat&#xff0c;而Springboot自身却直接整合了Tomcat&#xff0c;什么原理呢&#xff1f; 二、原理 SpringBoot应用只需要引入spring-boot-starter-web中这个依赖&#xff0c;应用程序就默认引入了tomcat依赖&#xff0c;其…

C语言——malloc开辟矩阵

目录 用动态内存开辟矩阵 矩阵初始化 用动态内存开辟矩阵 动态内存更多的知识在这篇博客&#xff0c;本文将介绍用malloc开辟矩阵。 malloc是C语言中用来动态开辟内存的&#xff0c;通过malloc函数可以向计算机申请一串连续的内存空间。 因为malloc开辟的内存在堆上&#…

Observability:从零开始创建 Java 微服务并监控它 (二)

这篇文章是继上一篇文章 “Observability&#xff1a;从零开始创建 Java 微服务并监控它 &#xff08;一&#xff09;” 的续篇。在上一篇文章中&#xff0c;我们讲述了如何创建一个 Java web 应用&#xff0c;并使用 Filebeat 来收集应用所生成的日志。在今天的文章中&#xf…

uni-app 超详细教程(三)(从菜鸟到大佬)

本文中内容为&#xff1a; 1. 支付功能&#xff08;微信支付&#xff0c;支付宝支付&#xff09; 2. 项目打包&#xff1a;&#xff08;APP打包&#xff0c;H5打包&#xff0c;微信小程序打包&#xff09; 一&#xff0c;uni - app 的支付功能 一、微信支付 1、登录微信开…

华为云数据库GaussDB(for Cassandra)揭秘:高性能低成本是什么样的体验?

在我们的日常理念中&#xff0c;追求性价比是最为常见的&#xff0c;但是你知道购买低配置还能享受高性能、低延时、超低价的数据库有哪些吗&#xff1f;今天我们就用数据说话&#xff0c;带你深入了解GaussDB(for Cassandra)挑战高性价比&#xff01; 众所周知&#xff0c;有…

操作系统实验5:信号量的实现与应用

写在最前的总结 下面的实验内容是在完整做完实验时候补充的&#xff0c;这里先把踩过的坑记录一下。 调试总结 先在Ubuntu上模拟生产者—消费者问题。这个实验分为两大部分&#xff0c;一个是实现信号量&#xff0c;另一个是验证信号量。对于第二个&#xff0c;建议先在Ubun…

【MySQL基础】MySQL常用的图形化管理工具有那些?

目录 一、为什么要使用MySQL图形化管理工具 原因 / 目的 / 作用 二、什么是DOS窗口? 三、常见的MySQL图形化管理工具有那些&#xff1f; 四、 常见几个MySQL图形工具的介绍 Navicat SQLyog MySQL Workbench DataGrip 五、Navicat图形工具的安装与使用 第一步&#x…