Java8 函数式编程【基础篇】

news2024/11/25 11:55:05

        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.coloradmin.cn/o/52375.html

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

相关文章

RESTful API是什么?看完你整个人都通透了

要弄清楚什么是RESTful API&#xff0c;首先要弄清楚什么是REST&#xff1f; 01 REST REpresentational State Transfer&#xff0c;英语的直译就是“表现层状态转移”。如果看这个概念&#xff0c;估计没几个人能明白是什么意思。那下面就让我来用一句话解释一下什么是RESTf…

低代码搭建质量管理解决方案,为企业管理提速降本

市场竞争的越来越卷&#xff0c;越来越多的制造企业认识到质量管理的重要性。尤其随着全球经济化与信息化的到来&#xff0c;质量管理已经成为企业管理的关键环节。然而与国际上具有先进技术和管理水平的企业相比&#xff0c;我国企业的质量管理较为薄弱&#xff0c;存在着质量…

【MATLAB】羽状图

目录 羽状图 羽状图 h0figure(toolbar,none,...position,[200 150 450 350],...name,实例28);subplot(2,1,1)alpha90:-10:0;rones(size(alpha));malpha*pi/180;nr*10;[u,v]pol2cart(m,n);feather(u,v)title(羽状图)axis([0 20 0 10])subplot(2,1,2)t0:0.5:10;x0.05i;yexp(-x*t…

R语言解释生存分析中危险率和风险率的变化

危险率函数 让我们模拟R中的一些数据&#xff1a; n < - 10000 h < - 0.5 t < - -log&#xff08;runif&#xff08;n&#xff09;&#xff09;/ h 该代码模拟了危险函数的存活时间&#xff0c;即常数。 视频&#xff1a;R语言生存分析原理与晚期肺癌患者分析案…

Ajax学习:jQuery发送ajax请求 通用方法$.ajax

app.all(/jQuery,(requset,response)>{response.setHeader(Access-Control-Allow-Origin,*);const data{name:张三};let strJSON.stringify(data);//需要转换称为json 否则传递的任然是对象response.send(str);//3s之后返回给客户端 }) $(button).eq(2).click(function() {/…

MySQL和Oracle JDBC驱动包下载步骤

MySQL官网&#xff1a;https://www.mysql.com/ 步骤如下&#xff1a; 1.点击DOWNLOADS 2.往下滑&#xff0c;找到MySQL Community&#xff08;GPL&#xff09;Downloands并点击 3.点击Connector/J 4.当前页面展示的是最新版本&#xff0c;要下载历史版本点击Archives 5.选择…

15 【登录鉴权】

15 【登录鉴权-Cookie】 1.什么是认证&#xff08;Authentication&#xff09; 通俗地讲就是验证当前用户的身份&#xff0c;证明“你是你自己”&#xff08;比如&#xff1a;你每天上下班打卡&#xff0c;都需要通过指纹打卡&#xff0c;当你的指纹和系统里录入的指纹相匹配…

细数APDL中的流程控制命令

作者&#xff1a;水哥ANSYS&#xff0c;获授权转载 一、概述 有过其他编程语言经验的同学都知道&#xff0c;流程控制类语言命令在编程中是必须掌握的一门技巧&#xff0c;这类命令能大幅提高我们的编程效率&#xff0c;增加程序可读性。类似地&#xff0c;在APDL中也有很多的…

R语言Poisson回归的拟合优度检验

在这篇文章中&#xff0c;我们将看一下Poisson回归的拟合优度测试与个体计数数据。 最近我们被客户要求撰写关于Poisson回归的研究报告&#xff0c;包括一些图形和统计输出。许多软件包在拟合Poisson回归模型时在输出中提供此测试&#xff0c;或者在拟合此类模型&#xff08;例…

不刷题,PMP考试可以通过吗?

不能&#xff0c;除非你的项目管理经验很厉害&#xff0c;但这么厉害也不需要PMP这个证书了&#xff0c;做一个比喻&#xff0c;学习项目管理知识是读兵书&#xff0c;做题就是“纸上谈兵”&#xff0c;获得PMP证书就是证明你有做指挥的资格&#xff0c;做项目是上战场指挥打仗…

提交代码出现error Empty block statement no-empty,代码却没报错?

开开心心写完代码&#xff0c;commit一下&#xff0c;发现可能控制台报错了&#xff1a; 看了代码却没发现有报错的&#xff0c;后来发现是开了eslint校验&#xff01; 因为存在空的if体&#xff0c;如下&#xff1a; 解决&#xff1a;保证if体不为空即可 参考&#xff1a;…

excel转换成pdf格式怎么操作?这3招教你Excel怎么转PDF

在我们日常办公中&#xff0c;经常会需要用到Excel表格&#xff0c;这类文件格式可以帮助我们日常记录统计数据&#xff0c;有效的提升办公效率。当我们需要将文件发送给别人&#xff0c;为了避免被改数据内容&#xff0c;很多时候都会将Excel转换为PDF格式。那么&#xff0c;E…

flask入门教程之数据库保存

计算机操作数据时&#xff0c;一般是在内存中对数据进行处理&#xff0c;但是计算机的内存空间有限&#xff0c;服务器操作大量数据时&#xff0c;容易造成内存不足&#xff0c;且一旦计算机关机&#xff0c;则内存数据就丢失。所以我们需要将数据进行存储。 持久化&#xff0…

HTTP协议发展史

简介 Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。是互联网上应用最为广泛的一种网络协议。所有的 WWW 文件都必须遵守这个标准。 超文本传输 …

地图数据设计(四):地图比例尺

前言 比例尺作为地图数学基础的组成部分之一&#xff0c;表示了地图的空间尺度&#xff0c;是地图精度和内容详尽程度的决定因素。今天的文章将从比例尺的基本概念、常见比例尺参数以及SuperMap iDesktopX中比例尺设置三个方面展开。 1 比例尺的基本概念 1.1 定义 一般来说&am…

Day16-购物车页面-商品列表修改购物车商品的勾选状态

提纲挈领&#xff1a; 我的操作&#xff1a; 1》当用户点击 radio 组件&#xff0c;希望修改当前商品的勾选状态&#xff0c;此时用户可以为 my-goods 组件绑定 radio-change 事件&#xff0c;从而获取当前商品的 goods_id 和 goods_state&#xff1a; 定义 radioChangeHandle…

达梦数据库备份策略

文章目录一、达梦数据库备份策略1.1 开启归档模式1.1.1 联机配置本地归档1.1.2 脱机配置本地归档1.2 启动DMAP服务1.2.1 启动DMAP1.3 物理备份1.3.1 联机备份(1) 数据库备份(2) 表空间备份(3) 表备份(4) 备份归档1.3.2 脱机备份(1) 启动DMRMAN(2) 备份数据库1.4 物理备份还原1.…

【Linux】命令

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

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…

美国硅基和宽禁带半导体供应链竞争力剖析

&#x1f446;扫描上方二维码&#xff0c;报名参与研讨会直播&#xff0c;福利多多~ 前言 本文概述了半导体供应链&#xff0c;包括传统半导体&#xff08;即硅基&#xff09;和 宽禁带&#xff08;WBG&#xff0c;Wide Bandgap&#xff09; 半导体&#xff0c;并深入探讨了宽禁…