读Java8函数式编程笔记05_数据并行化

Java8 函数式编程 Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来对 Java 集合运算和表达的高阶抽象。Stream API 可以极大提高 Java 程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 变换,聚合等。 阅读详情

1. 并发

1.1. 两个任务共享时间段

1.2. 一个程序要运行两个任务,并且只有一个CPU给它们分配了不同的时间片,那么这就是并发,而不是并行

2. 并行

2.1. 两个任务在同一时间发生

2.2. 为缩短任务执行时间,将一个任务分解成几部分,然后并行执行

2.3. 和顺序执行的任务量是一样的,区别就像用更多的马来拉车,花费的时间自然减少了

2.4. 重要

2.4.1. 不能再依赖提升CPU的时钟频率来提高现有代码的计算能力

2.4.2. 需要利用现代CPU的架构,而这唯一的办法就是编写并行化的代码

2.4.3. 阿姆达尔定律

2.4.3.1. 一个简单规则,预测了搭载多核处理器的机器提升程序速度的理论最大值

2.5. 优化任何和计算相关的任务立即变成了如何有效利用现有硬件的问题

3. 数据并行化

3.1. 将数据分成块,为每块数据分配单独的处理单元

3.2. 把工作拆分,同时在多核CPU上执行的方式

3.3. 调用parallel或者parallelStream方法实现数据并行化操作

4. 任务并行化

4.1. 线程不同,工作各异

4.2. Java EE应用容器

5. 并行化流操作

5.1. 在一个四核电脑上

5.1.1. 10张专辑

5.1.1.1. 串行化代码的速度是并行化代码速度的8倍

5.1.2. 100张专辑

5.1.2.1. 串行化和并行化速度相当

5.1.3. 10000张专辑

5.1.3.1. 并行化代码的速度是串行化代码速度的2.5倍

5.2. 速度提升的因素

5.2.1. 输入流的大小

5.2.2. 编写代码的方式

5.2.3. 核的数量

5.3. 底层

5.3.1. 并行流还是沿用了fork/join框架

5.3.1.1. fork递归式地分解问题,然后每段并行执行

5.3.1.2. 最终由join合并结果,返回最后的值

6. 模拟系统

6.1. 使用简单操作处理大量数据

6.2. 蒙特卡洛模拟法

6.2.1. 用在工程、金融和科学计算领域

7. 限制

7.1. 代码写得符合约定

7.2. 初值必须为组合函数的恒等值

7.2.1. 求和操作初值必须为0,因为任何数字加0,值不变

7.3. 组合操作必须符合结合律

7.3.1. 只要序列的值不变,组合操作的顺序不重要

7.4. parallel

7.5. sequential

7.6. 最后调用的那个方法起效

8. 性能

8.1. 数据大小

8.1.1. 只有数据足够大、每个数据处理管道花费的时间足够多时,并行化处理才有意义

8.2. 源数据结构

8.2.1. 每个管道的操作都基于一些初始数据源,通常是集合

8.2.2. 将不同的数据源分割相对容易

8.3. 装箱

8.3.1. 处理基本类型比处理装箱类型要快

8.4. 核的数量

8.4.1. 核越多,获得潜在性能提升的幅度就越大

8.4.2. 核的数量不单指你的机器上有多少核,更是指运行时你的机器能使用多少核。这也就是说同时运行的其他进程,或者线程关联性(强制线程在某些核或CPU上运行)会影响性能

8.5. 单元处理开销

8.5.1. 花在流中每个元素身上的时间越长,并行操作带来的性能提升越明显

8.5.2. 处理每个元素所花的时间

8.6. 通用数据结构性能

8.6.1. 性能好

8.6.1.1. ArrayList

8.6.1.2. 数组

8.6.1.3. IntStream.range

8.6.1.4. 支持随机读取,也就是说它们能轻而易举地被任意分解

8.6.2. 性能一般

8.6.2.1. HashSet

8.6.2.2. TreeSet

8.6.2.3. 不易公平地被分解,但是大多数时候分解是可能的

8.6.3. 性能差

8.6.3.1. LinkedList

8.6.3.2. Streams.iterate

8.6.3.3. BufferedReader.lines

8.6.3.4. 难于分解

8.7. 无状态操作

8.7.1. 整个过程中不必维护状态

8.7.2. map

8.7.3. filter

8.7.4. flatMap

8.8. 有状态操作

8.8.1. 有维护状态所需的开销和限制

8.8.2. sorted

8.8.3. distinct

8.8.4. limit

9. 工具类Arrays

Java 8的函数式编程:利用Java 8的lambda和Stream API,分享Java是如何采纳函数式编程思想的 Java 8新特性介绍 概述Java 8的新特性,如Lambda表达式、Stream API、函数式接口和默认方法 Lambda表达式 解释什么是Lambda表达式 介绍如何在Java中编写和使用Lambda表达式 举例(如使用lambda改写匿名内部类) 解析Lambda表达式的类型推断 展示使用Lambda表达式可带来的代码简化 函数式接口 介绍函数式接口的概念 介绍常用的函数式接口如Predicate, Function, Consumer, Supplier 阐述使用Lambda表达式实现函数式接口 阅读详情

相关推荐

《Java8实战》笔记(14):函数式编程的技巧

理解递归式Stream的思想.limit(n);不过这一方案看起来有些笨拙:你每次都需要遍历每个数字,查看它能否被候选数字整除(实际上,你只需要测试那些已经被判定为质数的数字)。理想情况下,Stream应该实时地筛选掉那些能被质数整除的数字。这听起来有些异想天开,不过我们一起看看怎样才能达到这样的效果。你需要一个由数字构成的Stream,你会在其中选择质数。你会从该Stream中取出第一个数字(即Stream的首元素),它是一个质数(初始时,这个值是2)。

2401_84152177的博客 951

java8 函数式编程 pdf_java8函数式编程 pdf

java8函数式编程 pdf的重要性就不言而喻了吧。对于每一个JAVA开发者,这都是一个必过的坎。虽然现在的主流编程方式还是面向对象式。当然也不能否认这种方式的健壮性,可扩展性。但是随着编程技术的发展。走在时代前列的函数式编程就粉墨登场了。而这本java8函数式编程就全面介绍了函数式编程的精华,对于很多这种全新的编程理念,大家绝对有必要阅读学习一下。对于JAVA的发展道路非常的有帮助。而这本书主要...

weixin_34277895的博客 1079

Ubuntu 24.04 下 NoMachine 极速安装与远程桌面配置全攻略

本文详细介绍了在Ubuntu 24.04系统下安装和配置NoMachine远程桌面的完整指南。从系统准备、分步安装到性能调优和常见问题解决,帮助用户快速实现低延迟的远程桌面访问。特别适合开发者和IT管理员在Linux环境下高效部署远程工作环境。

moon9的博客 945

Java8函数式编程_6--数据并行化

1,免责声明,本文大部分内容摘自《Java8函数式编程》。在这本书的基础上,根据自己的理解和网上一些博文,精简或者修改。本次分享的内容,只用于技术分享,不作为任何商业用途。当然这本书是非常值得一读,强烈建议买一本! 2,本次分享的样例代码均上传到github上,请点击这里。 注意:本章所有的例子大多围绕 1.3 节介绍的案例展开(音乐)。 第6章 数据并行化 前面多次提到,在Java 8中,编写并行化的程序很容易。这多亏了第3章介绍的 Lambda 表达式和流,我们完全不必理会串行或并行,只要告诉程序该做

Logan的专栏 628

Flutter + shorebird 热更新+自定义cdn下载

本文介绍了如何优化Flutter热更新方案Shorebird在国内网络环境下的使用体验。Shorebird默认使用海外CDN存在下载慢、连接不稳定等问题,建议将补丁包上传至国内CDN(如阿里云OSS)。文章详细讲解了Shorebird环境配置、项目集成、构建发布流程,并重点说明了如何修改客户端代码实现自定义补丁下载逻辑。通过替换默认下载器,将补丁下载地址指向国内CDN,可显著提升下载速度和稳定性。这种方案既保留了Shorebird的热更新能力,又解决了国内网络环境下的痛点,适合国内企业部署使用。

sir_Hu的博客 770

PIC单片机应用开发实践教程(二): 新建工程

File---New ProjectMicrochip Embedded --- Standalone Project 选择所用MCU对应型号 点击 Finish 后,工程就建好了 至止,我们的一个新工程就建完成了!

qq_57798018的博客 2888

Java8 函数式编程【基础篇】

而函数式编程(OOF)是对行为进行抽象,主要是抽象函数,是声明式编程风格,其核心是:在思考问题时,使用不可变值和函数,函数对一个值进行处理,映射成另一个值。Java 8是Java在保持向后兼容的前提下首次迈出重要一步,相比之前,不再是只对类库的改良,在编写复杂的集合处理、并行化执行、代码简洁度等方面都有颠覆性的提升。函数接口是只有一个抽象方法的接口,使用只有一个接口来表示某特定方法并反复使用,是一种表示函数的方式。任何需要函数式接口的地方,我们都可以使用Lambda表达式(或方法引用)。

qq_35808136的博客 1824

持续集成介绍及Jenkins自动化测试部署

学习持续集成及jenkins的自动化测试部署

ouihsiad的博客 4577

Java函数式编程

Java函数式编程 初探函数式编程【JavaScript篇】哔哩哔哩bilibili 三更草堂Up主。不会Lambda表达式、函数式编程?你确定能看懂公司代码?-java8函数式编程(Lambda表达式,Optional,Stream流)从入门到精通-最通俗易懂_哔哩哔哩_bilibili 项目地址:bearbrick0/FuncProgram: 👀Java函数式编程的demo (github.com) 什么是函数式编程 为什么要学习函数式编程

- 7129

超强干货之---Python-数据爬取(爬虫)

定义: 深度优先搜索是一种遍历或搜索树或图的算法,从起始节点开始,一直沿着一个分支走到底,再回溯到上一个节点继续搜索下一个分支,直到遍历完所有节点。特点递归:通常用递归实现,或者使用栈来模拟递归过程。内存占用低:在有大量分支的情况下,内存占用比广度优先搜索低。适合目标较深的情况:如果目标节点距离起始节点较深,DFS能更快找到目标。适用场景需要遍历所有节点的情况,如生成树、迷宫搜索。目标节点较深,且分支较多时。在大规模数据爬取时,选择合适的存储方式取决于数据的规模、结构和访问需求。

房东的猫的博客 5万+

vue2/3 - 【超详细】最新网站接入使用支付宝支付功能,点击支付跳转新页面后生成订单及支付二维码,实现支付宝在线付款详细的教程(整个支付的完整配置及支付流程,一键复制源码开箱即用)!

vue支付宝付款,vue支付宝支付,vue如何实现支付宝在线付款,vue网页pc项目接入支付宝支付,vue支付宝支付详细教程,vue2支付宝在线支付的详细示例代码,vue如何做支付宝付款,vue怎么实现支付宝的付款功能,vue调用支付宝进行付款支付,vue PC项目实现 支付宝支付,vue h5页面调用支付宝支付,vue页面唤起支付宝支付功能,vue支付宝支付跳转到新页面,vue如何跳转新开一页展示支付宝二维码支付,vue怎么新开页面进行支付宝在线支付,vue新页面支付宝支付功能,前端vue支付宝支付教程,

✅ 精选推荐文章 5729

Java8函数式编程

文章目录Java8函数式编程简介什么是函数式编程Lambda表达式引用值,而不是变量函数接口类型推断流常用的流操作生成流collect(toList())返回集合map将一个流中的值转为另一个新的流filter方法过滤元素flatMapmax和minreduce操作整合操作高阶函数PredicateFunctionBinaryOperator练习类库基本类型重载解析@FunctionalInter...

guanhang89的专栏 2944

小龙虾 OpenClaw 权限全攻略:轻松激活 elevated (最新版 OpenClaw 自动化任务降智、无权限、无法执行sudo等系统命令、提升 elevated 权限的解决方案)

升级小龙虾 OpenClaw 后权限不足?elevated 报错?📛 本文教你如何正确配置 OpenClaw 权限💻,让自动化任务顺利执行 🚀

XiaoqiangClub的博客 733

Java函数式编程入门

函数式编程在Java中不仅能提高代码的简洁性和可读性,还能在处理数据流、并行计算等场景中发挥重要作用。通过掌握Lambda表达式、Stream API、Optional以及其他相关技术,并结合实际业务场景的应用,你将能够更高效地开发出安全、稳定和可维护的系统。建议在日常项目中逐步引入函数式编程思想,从简单的集合操作开始,逐步探索更多高级特性,并结合代码评审和测试不断完善实践经验。/*** 函数式编程*//*** Function<T, R>:接受T类型的参数,返回R类型的结果。

zjh285077371的专栏 1779

TI单芯片毫米波雷达1642代码走读(〇)——总纲

前言 近年来,自动驾驶行业发展如火如荼,雷达技术也逐渐从军工封闭圈走向了开放的市场。 毫米波雷达具有全天候探测能力,特别是在雨雪雾天气以及夜间都能可靠工作,并且探测距离相对其他车载传感器非常远,对运动目标非常敏感,价格还低廉,这些特性都使其成为自动驾驶感知层面不可或缺的一环。 现如今的雷达已经不仅仅局限于测距测速测角等传统的功能,雷达技术正在从感知走向认知、从宽带走向超宽带、从二维走向三维四维、从相控阵走向数字阵列、从单通道走向MIMO、从独立工作走向分布式协同、从分立组件走向射频数字一体化。MIMO

3万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java 8 函数式编程详解:从思想到实战

函数式接口是 Java 8 函数式编程的 “桥梁”—— 它是有且仅有一个抽象方法的接口(可包含默认方法、静态方法,Java 8 接口增强特性),用于定义 “函数的形状”(输入参数类型、返回值类型)。若内置接口无法满足需求,可自定义函数式接口(需遵循 SAM 规则):java运行// 自定义:接收两个Integer,返回String的函数式接口// 使用:通过Lambda表达式实现接口TwoIntToString sumToString = (a, b) -> "总和:" + (a + b);

2501_94265850的博客 1245

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java8 函数式编程

1.函数式编程思想 a>概念 主要关注对数据进行什么操作, 特点:允许把函数本身作为参数传入另一个函数,还允许返回一个函数! 易于并发编程 2.lambda表达式 a>概念 jdk1.8推出的,对某些匿名内部类写法进行简化, 他是函数编程思想的一个重要体现,不在关注是什么对象,更关注对数据进行什么操作。 b>语法格式 (参数列表)->{代码} ............

我想静静 2450

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java8函数式编程3-并行与并发

Java8对程序并行和并发新增支持的简单介绍

cuiods的博客 2333

Java 1.8 函数式编程详解

Java 1.8 函数式编程详解 文章目录Java 1.8 函数式编程详解一. 概述1.1 java 8 新特性:二. 函数式接口2.1 函数式接口概述2.2 Lambda表达式概述2.3 java.util.function介绍 一. 概述 1.1 java 8 新特性: 概述: Java 8 正式版是一个有重大改变的版本,该版本对 Java 做了重大改进。本文章主要讲述java 1.8 函...

暗余的博客 2870

Java 8 函数式编程的技巧

本篇内容 一等成员、高阶方法、科里化以及局部应用 持久化数据结构 生成Java Stream 时的延迟计算和延迟列表 模式匹配以及如何在Java中应用 应用透明性和缓存 1.无处不在的函数    在前一篇中我们使用术语“函数式编程”意指函数或者方法的行为应该像“数学函数”一样——没有任何副作用。对于使用函数式语言的程序员而言,这个术语的范畴更加宽泛,它还意味着函数可以像任何其他值一样随意使用:可以作为参数传递,可以作为返回值,还能存储在数据结构中。能够像普通变量一样使用.

java大神起床啦 4万+

实战:Java 8中的函数式编程

函数式编程是一种编程范式(programming paradigm),追求的目标是整个程序都由函数调用(function applying)以及函数组合(function composing)构成的。函数调用大家容易理解,但在函数式编程中,函数调用有一个限制——它不会改变函数以外的其它状态,换而言之,即函数调用不会改变在该函数之外定义的变量值。这种函数有个专门的术语——纯函数(purely function)。纯函数有个特点,当参数值不变的时候,多次运行纯函数,得到的结果总是一样的。

为无为,事无事,味无味。 1623

Java8函数式编程Lamda

简介函数式编程核心:以处理数据的方式处理代码。相比较命令式编程的优点:1. 代码更加简洁优雅,效率更高 2. 避免了对变量的显式修改和赋值 3. 函数式风格的代码可以轻松的实现并行化 4. 代码表达性更强,更直观

iwillbeaceo的博客 1276

[Java 8] (1) 函数式编程简介

思维方式的转变 以从一个城市集合中寻找是否存在Chicago为例: 习惯的方式 boolean found = false; for(String city : cities) { if(city.equals("Chicago")) { found = true; break; } } System.out.println("Fo

不忘初心,好好沉淀 1万+

【函数式编程实战】(一)Java演变与函数式编程

Java8函数式编程实战开篇暴击,电商多重优惠核销代码初探

小明的Java问道之路 3785

Java如何支持函数式编程?

简介:Java是面向对象的语言,无法直接调用一个函数。Java 8开始,引入了函数式编程接口与Lambda表达式,便于开发者写出更少更优雅的代码。什么是函数式编程?函数式编程的特点是什么?本文通过代码实例,从Stream类、Lambda表达式和函数接口这三个语法概念来分享Java对函数式编程的支持。背景在很长的一段时间里,Java一直是面向对象的语言,一切皆对象,如果想要调用一个函数,函数必须属于一个类或对象,然后在使用类或对象进行调用。但是在其它的编程语言中,如JS、C++,我们可以直接写一个函数,然后在

阿里云开发者 4888
上一篇: 读Java8函数式编程笔记04_类库
下一篇: 读Java8函数式编程笔记06_Lambda表达式编写并发程序
躺柒
博客等级 码龄4年 7004粉丝 1321原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值