当前位置: 首页 > news >正文

瑞安微信网站36kr网站用什么做的

瑞安微信网站,36kr网站用什么做的,温州整站推广咨询,手机商城软件下载转载自 使用Java 8 Stream像操作SQL一样处理数据#xff08;上#xff09; 几乎每个Java应用都要创建和处理集合。集合对于很多编程任务来说是一个很基本的需求。举个例子#xff0c;在银行交易系统中你需要创建一个集合来存储用户的交易请求#xff0c;然后你需要遍历整个…转载自 使用Java 8 Stream像操作SQL一样处理数据上 几乎每个Java应用都要创建和处理集合。集合对于很多编程任务来说是一个很基本的需求。举个例子在银行交易系统中你需要创建一个集合来存储用户的交易请求然后你需要遍历整个集合才能找到这个客户这段时间总共花费了多少金额。尽管集合非常重要但是在java中对集合的操作并不完美。 首先对一个集合处理的模式应该像执行SQL语言操作一样可以进行比如查询一行交易中最大的一笔、分组用于消费日常用品总金额这样的操作。大多数据库也是可以有明确的相关操作指令比如SELECT id, MAX(value) from transactionsSQL查询语句可以让你找到所有交易中最大的一笔交易和其ID。 正如你所看到的我们不需要去实现怎样计算最大值比如循环和变量跟踪得到最大值。我们只需要表达我们期待什么。那么为什么我们不能实现与数据库查询方式相似的方式来设计实现集合呢 其次我们应该怎么有效处理很大数据量的集合呢要加速处理的理想方式是采用多核架构CPU但是编写并行代码很难而且会出错。 Java 8 将能够完美解决这这个问题Stream的设计可以让你通过陈述式的方式来处理数据。stream还能让你不写多线程代码也是可以使用多核架构。听起来很棒不是吗这将是这系列文章将要探索的主要内容。 在我们探索我们怎么样使用stream之前我们先看一个使用Java 8 Stream的新的编程模式。我们需要找出所有银行交易中类型是grocery的并且以交易金额的降序的方式返回交易ID。在Java 7中我们需要这样实现 在Java 8中这样就可以实现 下图展示了Java 8的实现代码首先我们使用stream()函数从一个交易明细列表中获取一个stream对象。接下来是一些操作filtersortedmapcollect连接在一起形成了一个管道管道可以被看做是类似数据库查询数据的一种方式。 Stream 模型 那么怎么处理并行代码呢在Java8中非常简单只需要使用parallelStream()取代stream()就可以了如下面所示Stream API将在内部将你的查询条件分解应用到多核上。 你可以把stream看做是一种对集合数据提高效能、提供像SQL操作一样的抽象概念这个像SQL一样的操作可以使用lambda表达式表示。 在这一系列关于Java 8 Stream文章的结尾你将会使用Stream API写类似于上述代码来实现强大的查询功能。 开始使用Stream 我们先以一些理论作为开始。stream的定义是什么一个简单的定义是对一个源中的一系列元素进行聚合操作。把概念拆分一下 一系列元素Stream对一组有特定类型的元素提供了一个接口。但是Stream并不真正存储元素元素根据需求被计算出结果。 源Stream可以处理任何一种数据提供源比如结合、数组或者I/O资源。 聚合操作Stream支持类似SQL一样的操作常规的操作都是函数式编程语言比如filtermapreducefindmatchsorted等等。 Stream操作还具备两个基本特性使它与集合操作不同 管道许多Stream操作会返回一个stream对象本身。这就允许所有操作可以连接起来形成一个更大的管道。这就就可以进行特定的优化了比如懒加载和短回路我们将在下面介绍。 内部迭代和集合的显式迭代外部迭代相比Stream操作不需要我们手动进行迭代。 让我们再次看一下之前的代码的一些细节 stream模型细节 我们首先通过stream()函数从一个交易列表中获取一个Stream对象。这个数据源是一个交易的列表将会为Stream提供一系列元素。接下来我们对Stream对象应用一些列的聚合操filter通过给定一个谓词来过滤元素sorted通过给定一个比较器实现排序和map(用于提取信息)。除了collect其他操作都会返回Stream这样就可以形成一个管道将它们连接起来我们可以把这个链看做是一个对源的查询条件。 在collect被调用之前其实什么实质性的东西都都没有被调用。 collect被调用后将会开始处理管道最终返回结果结果是一个list。 在我们探讨stream的各种操作前我们还是看一个stream和collection的概念层面的不同之处吧。 Stream VS Collection Collection和Stream都对一些列元素提供了一些接口。他们的不同之处是Collection是和数据相关的Stream是和计算相关的。 想一下存在DVD中的电影这是一个collection因为他包含了所有的数据结构。然而网络上的电影是一种流数据。流媒体播放器只需要在用户观看前先下载一些帧就可以观看了不必全都下载下来。 简单点说Collection是一个内存中的数据结构Collection包括数据结构中的所有值——每个Collection中的元素在它被添加到集合中之前已经被计算出来了。相反Stream是一种当需要的时候才会被计算的数据结构。 使用Collection接口需要用户做迭代比如使用foreach这种方式叫外部迭代。相反Stream使用的是内部迭代——它会自己为你做好迭代并且帮助做好排序。你只需要提供一个函数说明你想要干什么。下面代码使用Collection做外部迭代 下面代码使用Stream做内部迭代 使用Stream处理数据 Stream 接口定义了许多操作可以被分为两类。 filtersorted和map这些可以连接起来形成一个管道的操作 collect可以关闭管道返回结果的操作 可以被连接起来的操作叫做中间操作。你可以把他们连接起来因为他们返回都类型都是Stream。关闭管道的操作叫做终结操作。他们可以从管道中产生一个结果比如一个List,一个Integer甚至一个void。 中间操作其实不执行任何处理直到一个终结操作被调用他们很“懒”。因为终结操作通常可以被合并,并且被终结操作一次性执行。 上面的代码会计算集合中的前两个偶数执行结果如下 这是因为limit(2)使用了短回路我们只需要处理stream的一部分然后并返回结果。这就像要计算一个很大的Boollean表达式只要一个表达式返回false我们就可以断定这个表达式将会返回false而不需要计算所有。这里limit操作返回一个大小为2的stream。还有就是filter操作和map操作合并起来一起传给给了stream。 总结一下我们现已经已经学到的东西Stream的操作包括如下三个东西 一个需要进行数据查询的数据源比如一个collection 一连串组成管道的中间操作 一个执行管道并产生结果的终结操作 Stream提供的操作可分为如下四类 过滤:有如下几种可以过滤操作 filter(Predicate)使用一个谓词java.util.function.Predicate作为参数返回一个满足谓词条件的stream。 distinct返回一个没有重复元素的stream根据equals的实现 limit(n): 返回一个不超过给定长度的stream skip(n): 返回一个忽略前n个的stream 查找和匹配:一个通常的数据处理模式是判断一些元素是否满足给定的属性。可以使用 anyMatch, allMatch, 和 noneMatch 操作来帮助你实现。他们都需要一个predicate作为参数并且返回一个boolean作为作为结果因此他们是终结操作。比如你可以使用allMatch来检车在Stream中的所有元素是否有一个值大于100像下面代码中表示的那样。 另外Stream提供了findFirst和findAny,可以从Stream中获取任意元素。它们可以和Stream的其他操作连接在一起比如filter。findFirst和findAny都返回一个Optional对象像下面这样 Optional类可以存放一个存在或者不存在的值。在下面代码中findAny可能没有返回一个交易类型是grocery类的信息。Optional存在好多方法检测元素是否存在。比如如果一个交易信息存在我们可以使用相关函数处理optional对象。 映射Stream支持map方法map使用一个函数作为一个参数,你可以使用map从Stream的一个元素中提取信息。在下面的例子中我们返回列表中每个单词的长度。 你可以定制更加复杂的查询比如“交易中最大值的id”或者“计算交易金额总和”。这种处理需要使用reduce操作reduce可以将一个操作应用到每个元素上知道输出结果。reduce也经常被叫做折叠操作因为你可以看到这种操作像把一个长的纸张你的stream不停地折叠直到想成一个小方格这就是折叠操作。 看一下一个例子 列表中的每个元素使用加号都迭代地进行了结合从而产生了结果。我们本质上是“减少”了集合中的数据最终变成了一个数。上面的代码有两个参数初始值和结合list中元素的操作符“” 当使用Stream的reduce方法时我们可以使用下面的代码将集合中的数字元素加起来。reduce方法有两个参数 初始值,这里是0。 一个将连个数相加返回一个新值的BinaryOperator reduce方法本质上抽象了重复的模式。其他查询比如“计算产品”或者“计算最大值”是reduce方法的常规使用场景。 数值型Stream 你已经看到了你可以使用reduce方法来计算一个Integer的Stream了。然而我们却执行了很多次的开箱操作去重复地把一个Integer对象添加到另一个上。如果我们调用sum方法岂不是很好像下面代码那样这样代码的意图也更加明确。 在Java 8 中引入了三种原始的特定数值型Stream接口来解决这个问题它们是IntStream, DoubleStream, 和 LongStream。它们各自可以数值型Stream变成一个int、double、long。 可以使用mapToInt, mapToDouble, and mapToLong将通用Stream转化成一个数值型Stream我们可以将上面代码改成下面代码。当然你可以使用通用Stream类型取代数值型Stream然后使用开箱操作。 数值类型Stream的另一个用途就是获取一个区间的数。比如你可能想要生成1到100之前的所有数。Java 8在IntStream, DoubleStream, 和 LongStream 中引入了两个静态方法来帮助生成一个区间它们是range 和 rangeClosed. 这两个方法以区间开始的数为第一个参数以区间结束的数为第二个参数。但是range的区间是开区间的rangeClosed是闭区间的。下面是一个使用rangeClosed返回10到30之间的奇数的stream。 创建Stream 有几种方式可以创建Stream。你已经知道了可以从一个集合中获取一个Stream还你使用过数值类型Stream。你可以使用数值、数组或者文件创建一个Stream。另外你甚至可以使用一个函数生成一个无穷尽的Stream。 通过数值或者数组创建Stream可以很直接对于数值是要使用静态方法Stream .of对于数组使用静态方法Arrays.stream 像下面代码这样 你可以使用Files.lines静态方法将一个文件转化为一个Stream。比如下面代码计算一个文件的行数。 无穷Stream 到现在为止你知道了Stream元素是根据需求产生的。有两个静态方法Stream.iterate和Stream.generate可以让你从从一个函数中创建一个Stream因为元素是根据需求计出来的这两个方法可以一直产生元素。这也是我们叫无穷Stream的原因Stream没有一个固定的大小但是它和从固定大小的集合中创建的stream是一样的。 下面代码是一个使用iterate创建了包含一个10的倍数的Stream。iterate的第一个参数是初始值第二个至是用于产生每个元素的lambda表达式类型是UnaryOperator。 我们可以使用limit操作将一个无穷的Stream转化为一个大小固定的stream像下面这样 总结 Java 8引入了Stream API这可以让你实现复杂的数据查询处理。在这片文章中我们已经看到了Stream支持很多操作比如filter、mpareduce和iterate这些操作可以方便我们写简洁的代码和实现复杂的数据处理查询。这和Java 8之前使用的集合有很大的不同。Stream有很多好处。首先,Stream API使用了注入懒加载和短回路的技术优化了数据处理查询。第二Stream可以自动地并行运行充分使用多核架构。在下一篇文章中我们将探讨更多高级操作比如flatMap和collect。
http://www.pierceye.com/news/717640/

相关文章:

  • 网站seo是啥镜像wordpress博客
  • 广州手机网站建设电子商务平台经营者对于竞价排名的商品或服务
  • 宁波网站建设联系电话查询网站页面设计服务
  • 网站建设关键词分类如何建设品牌网站
  • 常平哪里有招计算机网站开发的商业网站制作
  • 手机关键词点击排名软件长春seo排名扣费
  • 海晏县公司网站建设湖南省郴州市汝城县
  • 蒙阴做网站做网站怎么提取视频无广告
  • 整个网站都在下雪特效怎么做贵州省住房与城乡建设厅网站
  • 腾讯合作网站建设有哪些公司自己的网站做防伪码
  • 网站制作完成ks刷粉网站推广马上刷
  • 网站注册域名位置网上买一个商标多少钱
  • 网站开发 无形资产门户网站搭建方案
  • 湘西北京网站建设网站建设好发信息网
  • 淄博公司网站建设网站设计编程有哪些
  • 如何获取网站访客qq如何知道一个网站用什么建设的
  • 快站app客户管理软件多少钱
  • 山西教育学会的网站建设工作做ppt课件的网站
  • 网站开发还有哪些班级网站如何去建设
  • 学校网站框架wordpress 多个网址导航
  • 茶叶红酒网站建设关键词的优化方法
  • 做网站后台用什么语言好吴川市建设工程公司网站
  • 海口专业网站建设公司怎样利用网站做淘宝客
  • 雄安专业网站建设方案长沙做网站建设
  • 微信上的网站实物黄金哪个网站做的好
  • 网站建设的作用和用途wordpress外网固定链接
  • 网站做多长时间才有流量上海商城网站制作公司
  • 做电影网站服务器网站如何备案 流程图
  • 太原建站模板搭建wordpress attachment
  • 购买腾讯备案网站网站错误列表