JAVA流 学习思考

news2024/11/27 0:32:02

1. 水在前面

        接着上周的Lambda表达式,这周学习了流。说实话作为工具来讲,这玩意好像挺强大的,倒是真要掌握这工具貌似要记住不少东西,年纪大了不想背书的可以看看这篇水文,等到用的时候再根据具体的使用找度娘。(题外话,现在大家码的时候一般是用的什么搜索引擎?)

2. 关于教材

        还是推荐上周这本《JAVA 8 实战》Raoul-Gabriel Urma,Mario Fusco 著 (pdf版 wx号:zhenyeli86  添加好友请说明技术交流,5毛党)。其实不是很想推荐这本书,这本书对并行流这部分的描述感觉不是很到位(当然也有可能是我的理解能力低 -_- )。但是这周有点懒没对比其他的书籍了,就先这样吧。

3. 学习记录

        以前对于流的认知stream的认知很局限,认为只是用在网络编程里的通讯工具。经过一周的学习,发现流还是挺有用的,起码是挺好用的。它为我们提供了一种可以简洁、优雅地处理集合集合的工具。

3.1. 流是什么

        流是JAVA8 提供的API接口,是一种处理集合的工具,这里的集合是一个宽泛的概念,包括字符串、数组、list、set等等有序或无序的元素集合。

        可以通俗的认为,stream为集合提供了内部迭代,就是说它帮我们实现迭代,而不需要我们写foreach之类的东西了。

        好吧,水成这样,我自己都不好意思。。。不过这里先稍微有个概念,后面我再说说流这里面体现的设计模式思想。

3.2. 流操作

        整个stream的操作说复杂也不复杂,总结起来也就两大类:中间操作和终端操作。

  • 中间操作就是把输入的是流,输出的也是流。
  • 终端操作就是把输入流计算、转换、规约成一个结果。

        说到这里提一下集合跟流的那点破事,上面说到流是一种处理集合的工具,流通通过把集合转换成独特数据结构stream,然后用自身提供的函数工具来完成对集合的处理。流从内部帮我们完成了遍历集合的工作,但是流经过流操作以后数据是不能逆的。怎么说呢?集合foreach只是遍历,不会破坏(当然你要破坏也行)集合,但是经过流操作以后就把数据破坏了。你要重新来就只能把集合重新转成流了。总而言之,流只能遍历一次!

3.3. 使用流

        流的使用也简单,我们看一段代码,没有什么语法可言,就是简单的调用函数而已。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Demo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        
		List<String> names = Arrays.asList("Peter", "John", "Rose");
        
        //主要看这里就行了
		List<Integer> longNames  =  names.stream() //list 转换成stream
				                   .map(String::length) // 中间操作
				                   .collect(Collectors.toList()); //终端操作
		
	    for(Integer len : longNames){
	    	System.out.print(len.toString() + " ");
	    }
		
	}

}

        到这里,基本就清楚了该怎么使用stream了,后面只要大家在使用的时候根据自己的需求去选择相应的中间操作API和终端操作API就好了。是不是很简单!

3.4. 流背后的设计思想

        函数式编程的思想就不说了(其实我也没弄清楚函数式编程的思想是啥。。。),这里准备水一下“Builder模式(建造者模式)”。

        其实一开始看stream的时候,感觉有点像职责链模式。但是职责链要求数据沿着链条往下走,并且职责链模式是行为模式,跟stream貌似有点不搭。想了几天后来在回看《JAVA8实战》的时候偶然看到原来书上写得好明白。

        立刻去复习一遍建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

        意思确实是有那么点意思!就是你要创建一个复杂的对象,这个对象需要好几个步骤来完成,但是不同的实现可能需要不同的步骤来组合。对于流来说就调用不同的中间操作,最后用中间操作来结束! 

        嗯,学习了新知识有复习了老东西,挺好!以后想到建造者模式,就想起stream,肯定不会忘记。

3.5. 关于并行流

        本来想详细学习一下并行流的内容,但是书上写的有点不到位(反正我看不深入),这里就先粗略记录,后续找机会专门学习java的并行编程再详细水。

        通俗的水,并行流就是通过不断拆分流中的数据(或者说是任务),一直到规模足够小,然后把这些任务分配到多核CPU的核上来进行并行处理,最后再把结果合并从而提高运行效率。

        这是分治算法思想的应用,核心在于拆分(分治)多少个任务以及是否需要用并行运算(有时候直接单核流水才是最佳实践)的判断。其中有个技术很有意思:work steal(工作窃取)。就是把等待执行的任务队列中的任务,调整分配到空闲的任务队列中,以提高并行效率(负载均衡思想)。当然,我们可以使用java给我们提供的拆分方式,也可以自定义拆分方式以达到最佳效果,毕竟高手在民间啊。

4. 水在最后

        今天岳父大人生日,要去请他老人家吃饭,只能先水这么多了。本周的学习确实在并行流方面看的不够深入,先留个引子,有机会专门看一看JAVA并发编程相关的内容来填上缺口。

        因为工作的关系,接下来主要从事数据治理相关的东西,关于JAVA的学习先暂停一下了,这段时间看的东西虽然不多,但是发现其实JAVA还是很博大精深的,以前是真的思维局限了。。。

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

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

相关文章

常用技术-Timer定时器

什么是Timer Timer是JDK自带的任务调度工具类&#xff0c;只需要java.util.Timer和java.util.TimerTask两个类就可以实现基本任务调度功能 Timer是一种线程设施&#xff0c;用于安排以后在后台线程中执行的任务。可安排任务执行一次&#xff0c;或者定期重复执行&#xff0c;…

谈谈配置中心?

配置中心可以做集中式的服务配置管理&#xff0c;比如配置一些数据库连接的URL&#xff0c;一些共用的配置且可动态调整的参数。如果不采用集中式的管理&#xff0c;会导致修改起来特别麻烦&#xff0c;一个个的修改特别繁琐。 Nacos Config配置中心中采用的是客户端拉取数据&a…

腾讯云轻量应用服务器“月流量”限制?流量不够怎么办?

腾讯云轻量应用服务器套餐带流量包&#xff0c;就是有月流量限制的意思&#xff0c;超出轻量套餐的流量需要另外支付流量费&#xff0c;轻量服务器地域不同超额流量费用也不同&#xff0c;北京上海广州等中国内地地域流量价格是0.8元每GB&#xff0c;中国香港地域流量价格是1元…

Xilinx IDDR及ODDR使用和仿真

平台&#xff1a;Vivado2018 官方相关文档&#xff0c;ug471_7Series_SelectIO.pdf 关于IDDR与ODDR Input DDR Resource(IDDR) 外部的数据在时钟的上下沿同时传输数据&#xff0c;我们可以使用IDDR原语将输入的单bit数据转化为2bit的数据输出。同时数据速率变为原来的二分之一…

python的Web框架比较

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 之前好像写过一些关于Python的Web框架?现在再按照ASGI与原本的WSGI区分一下,顺便把框架(framework)与库(library)区分一下. 之前我也写过(或者说想过)一些类似生态以及作用的框架进行比较,大多都是看看网上评价以及s…

微服务demo(三)nacosfeign

一、feign使用 1、集成方法 1.1、pom consumer添加依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.2.6.RELEASE</version></dependency&…

算法学习——LeetCode力扣补充篇2

算法学习——LeetCode力扣补充篇2 724. 寻找数组的中心下标 724. 寻找数组的中心下标 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个整数数组 nums &#xff0c;请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右…

C语言 05 变量与常量

变量 变量就像在数学中学习的 x&#xff0c;y 一样&#xff0c;可以直接声明一个变量&#xff0c;并利用这些变量进行基本的运算&#xff0c;声明变量的格式为&#xff1a; 数据类型 变量名称 初始值;&#xff08;其中初始值可以不用在定义变量时设定&#xff09; 是赋值操作…

【python】常用函数汇总(持续更新……)

文章目录 【numpy.exp()】返回e的幂次方&#xff0c;e是一个常数为2.71828【np.dot()】矩阵相乘【np.linalg.inv()】矩阵求逆 【numpy.exp()】返回e的幂次方&#xff0c;e是一个常数为2.71828 举例&#xff1a;numpy.exp() 【np.dot()】矩阵相乘 【要点】 1、前者的列数后者…

Springboot之RESTful风格

目录 1、概述&#xff1a; 1.1、传统风格的API&#xff1a; 1.2、RESTful风格的API&#xff1a; 1.3、GET、POST、PUT、DELETE&#xff1a; 2、RESTful风格相关的注解&#xff1a; ①PathVariable&#xff0c;用来获取url中的数据&#xff1b; ②GetMapping&#xff0c;接…

Xcode删除原本的Git,再添加新的git

本文参考&#xff1a;Xcode怎么删除原本git,在重新设置新的git地址_ios xcode 删除原本git-CSDN博客 开发中会有一个问题。Xcode项目A 提交到Git服务器server1&#xff0c;此时项目A内部已经存在一个Git文件&#xff0c;与server1相关联。 此时你想将项目A提交到 另一个Git…

SSH免密登录——linux

SSH免密登录——linux 方法一一、用 ssh-key-gen 在本地主机上创建公钥和密钥二、用 ssh-copy-id 把客户端公钥追加到远程主机的 .ssh/authorized_key 上三、直接登录远程主机 方法二一、将生成的客户端公钥id_rsa.pub内容追加至目标主机.ssh/authorized_key 中参考链接 SSH免密…

论文阅读,Accelerating the Lattice Boltzmann Method(五)

目录 一、Article:文献出处&#xff08;方便再次搜索&#xff09; &#xff08;1&#xff09;作者 &#xff08;2&#xff09;文献题目 &#xff08;3&#xff09;文献时间 &#xff08;4&#xff09;引用 二、Data:文献数据&#xff08;总结归纳&#xff0c;方便理解&am…

【vue2+antvx6】报错Cannot read properties of undefined (reading ‘toUpperCase‘)

我的代码是这样的 <el-collapseref"collapse"v-model"active"accordionclass"collapseStart"change"collapsechange"><el-collapse-item:name"String(index 1)"v-for"(i, index) in List":key"in…

程序员/后端开发方向Java 跳槽注意事项(简历和面试经验分享)

程序员/后端开发方向Java 跳槽注意事项&#xff08;简历和面试经验分享&#xff09; 应届生面试经验参考&#xff1a;https://www.cnblogs.com/rainbow-1/p/16779048.html 简历&#xff1a; 1、个人感觉还是要写真话&#xff0c;包装的内容要有一定的基础&#xff0c;问起来能…

数据结构——lesson13排序之计数排序

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

高炉项目中DeviceNET到Ethernet的转换奥秘

在工业自动化的世界中&#xff0c;高炉项目中的数据通信至关重要。其中DeviceNET和Ethernet作为两种主流的网络协议&#xff0c;扮演着不可或缺的角色。它们之间的转换不仅仅是技术上的桥梁&#xff0c;更是实现信息高效传递的关键。今天&#xff0c;我们就来揭开从DeviceNET到…

解读langchain与详细步骤

langchain框架目前以python或javascript包的形式提供&#xff0c;具体来说是TypeScript。 假如你想从你自己的数据、你自己的文件中具体了解一些情况&#xff0c;它可以是一本书&#xff0c;一个pdf文件&#xff0c;一个包含专有信息的数据库。Langchain允许你将GPT-4这样的大…

Python版【植物大战僵尸 +源码】

文章目录 写在前面&#xff1a;功能实现环境要求怎么玩个性化定义项目演示&#xff1a;源码分享Map地图:Menubar.py主菜单 主函数&#xff1a;项目开源地址 写在前面&#xff1a; 今天给大家推荐一个Gtihub开源项目&#xff1a;PythonPlantsVsZombies&#xff0c;翻译成中就是…

mybatis配置文件解析

可解析标签 configuration&#xff08;配置&#xff09; properties&#xff08;属性&#xff09;settings&#xff08;设置&#xff09;typeAliases&#xff08;类型别名&#xff09;typeHandlers&#xff08;类型处理器&#xff09;objectFactory&#xff08;对象工厂&#…