集合运算

Java8 Stream常用函数及使用说明

China☆狼群 提交于 2019-12-09 06:30:55
1. 什么是Stream? Stream作为java8中增加的一个非常重要特性,为我们提供了对集合的一系列操作,简化了对集合元素的操作复杂度,让我们可以更加专注与业务逻辑的实现,stream的操作一般需要和Lambda表达式进行结合使用,达到简便的操作及清晰的代码。 Stream的使用主要分两部分: 惰性求值 (of, map, flatmap, filter…) 及早求值 (reduce, max, min, collect…) 2. 什么是惰性求值和及早求值? 判断一个操作是惰性求值还是及早求值可以通过操作的返回值进行判断,如果返回的是一个stream,那么就是惰性求值,否则就是及早求值。 惰性求值的特点: 惰性求值的操作并没有对集合元素进行实际的遍历,只有在进行及早求值的时候才开始遍历元素。 惰性求值返回的是stream对象。 3. 如何使用Stream函数对集合进行操作? 在日常的使用中,我们都是惰性求值和及早求值进行配合,一般来说,先对集合进行惰性求值,最后再对生成的新stream对象进行及早求值。 大家可以把stream的操作过程想像成一个生产线,我们的集合元素从生产线的一头进入,然后在生产线的另一头重新生成集合或者元素,进入的过程就是生成一个steam对象,即第一次惰性求值,出来的时候是一个及早求值的过程,将steam重新生成集合或者元素

Java的Stream流式处理

…衆ロ難τιáo~ 提交于 2019-12-09 06:29:50
在公司,看到大神写的代码优美而高效,其中之一就是对集合等数据结构大量使用了Stream流式操作,极大的提高编程效率和程序可读性。下面学习一下流式操作,在这里用博客记录一下。 ##为什么需要 Stream Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对 大数据 实时处理的 Stream 。 Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation) 。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错, 但使用 Stream API 无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。所以说,Java 8 中首次出现的 java.util.stream 是一个函数式语言

如何处理海量数据(长文)

冷暖自知 提交于 2019-12-08 19:07:07
在实际的工作环境下,许多人会遇到海量数据这个复杂而艰巨的问题,它的主要难点有以下几个方面: 一、数据量过大,数据中什么情况都可能存在。 如果说有10条数据,那么大不了每条去逐一检查,人为处理,如果有上百条数据,也可以考虑,如果数据上到千万级别,甚至 过亿,那不是手工能解决的了,必须通过工具或者程序进行处理,尤其海量的数据中,什么情况都可能存在,例如,数据中某处格式出了问题,尤其在程序处理时, 前面还能正常处理,突然到了某个地方问题出现了,程序终止了。 二、软硬件要求高,系统资源占用率高。 对海量的数据进行处理,除了好的方法,最重要的就是合理使用工具,合理分配系统资源。一般情况,如果处理的数据过TB级,小型机是要考虑的,普通的机子如果有好的方法可以考虑,不过也必须加大CPU和内存,就象面对着千军万马,光有勇气没有一兵一卒是很难取胜的。 三、要求很高的处理方法和技巧。 这也是本文的写作目的所在,好的处理方法是一位工程师长期工作经验的积累,也是个人的经验的总结。没有通用的处理方法,但有通用的原理和规则。 下面我们来详细介绍一下处理海量数据的经验和技巧: 一、选用优秀的数据库工具 现在的数据库工具厂家比较多,对海量数据的处理对所使用的数据库工具要求比较高,一般使用Oracle或者DB2,微软 公司最近发布的SQL Server 2005性能也不错。另外在BI领域:数据库,数据仓库

海量数据处理:算法

与世无争的帅哥 提交于 2019-12-08 19:06:42
海量信息即大规模数据,随着互联网技术的发展,互联网上的信息越来越多,如何从海量信息中提取有用信息成为当前互联网技术发展必须面对的问题。 在海量数据中提取信息,不同于常规量级数据中提取信息,在海量信息中提取有用数据,会存在以下几个方面的问题: (1)数据量过大,数据中什么情况都可能存在,如果信息数量只有20条,人工可以逐条进行查找、比对,可是当数据规模扩展到上百条、数千条、数亿条,甚至更多时,仅仅只通过手工已经无法解决存在的问题,必须通过工具或者程序进行处理。 (2)对海量数据信息处理,还需要有良好的软硬件配置,合理使用工具,合理分配系统资源。通常情况下,如果需要处理的数据量非常大,超过了TB级,小型机、大型工作站是要考虑的,普通计算机如果有好的方法也可以考虑,如通过联机做成工作集群。 (3)对海量信息处理时,要求很高的处理方法和技巧,如何进行数据挖掘算法的设计以及如何进行数据的存储访问等都是研究的难点。 针对海量数据的处理,可以使用的方法非常多,常见的方法有Hash法、Bit-map法、Bloom filter法、数据库优化法、倒排索引法、外排序法、Trie树、堆、双层桶法以及MapReduce法。 Hash法 哈希函数的特点 哈希函数的构建方法 解决冲突的方法 Bit-map法 Bloom filter法 数据库优化法 倒排索引法 外排序法 Trie树 堆 双层桶法

Java海量数据处理算法

谁都会走 提交于 2019-12-08 18:51:51
文章目录 Hash法 Bit-map法 Bloom filter法 数据库优化法 倒排索引法 正向索引 外部排序法 trie树 兄弟单词 求解兄弟单词的经典例子 堆 双层桶法 MapReduce法 经典实例 top K问题 BFPRT算法(TOP-K问题必会) 重复问题 排序问题 Hash法 在处理海量数据的过程中,使用hash法一般可以快速存取,统计某些数据,将大量数据进行分类,例如提取某日访问网站次数最多的IP地址等. 常用散列函数的构建方法如下: 直接寻址法 取关键字或关键字的某个线性函数值为散列地址,即h(key)=key或h(key)=a*key+b.直接寻址法不会产生冲突,时间复杂度为o(1),空间复杂度为o(n),但由于它没有压缩映像,因此,当关键字集合很大时,使用这种hash函数是不可能实现地址编码的散列的(因为key集合必须有穷且不能超出物理存储大小). 取模法 选择一个合适的正整数p,令h(key)=key mod p.p如果选择的是比较大的素数,则效果比较好,一般选取p为tablesize,即散列表的长度. 数学分析法 根据关键字的个数n和r进制,通过统计在各个位上数符出现频率找出各个位上出现出现次数最接近n/r的数符作为不变的散列地址位. 折叠法 将关键字分成位数为t的几个部分(最后一部分可能小于t),然后把各部分按位对齐进行相加,将所得的和舍弃进位

海量数据处理问题学习笔记

早过忘川 提交于 2019-12-08 18:04:20
海量数据处理问题的常见场景有两种:(1)给定一定大小的数据(文件),数据(文件)大小大于内存容量,无法全部同时转载进内存中,然后需要对其进行处理,比如找重复项,或者找TOP k 项;( 2 )给出非常大的待处理数据,比如 100 万个数找前 100 大的数,然后需要对其进行高效的处理(不可直接排序然后提取,因为这要太慢了)。总的来说,海量数据处理问题 主要需要处理的两个方面的问题,一是内存不够,二是时间不够。内存不够,则要遵循“分而治之”的思想去寻找解决方案,把待处理数据化大为小,然后装进内存里面处理。时间不够,则需要合理的利用数据结构,设计合适的算法解决问题。 ——————————————————————————————————————————————————— 方法&工具 处理这样子的问题,主要的工具有: ( 1 ) Hash Hash 被译为哈希,或者散列。 Hash Function 在维基百科上的定义是: A hash function is any algorithm that maps data of variable length to data of a fixed length. Hash Table (散列表)是 Hash 的一个重要应用。散列表通过把关键码值( key value )映射到表中的一个位置来访问记录,以加快查找的速度。 Hash 是一种映射关系

海量数据处理:算法

感情迁移 提交于 2019-12-08 17:55:57
海量信息即大规模数据,随着互联网技术的发展,互联网上的信息越来越多,如何从海量信息中提取有用信息成为当前互联网技术发展必须面对的问题。 在海量数据中提取信息,不同于常规量级数据中提取信息,在海量信息中提取有用数据,会存在以下几个方面的问题: (1)数据量过大,数据中什么情况都可能存在,如果信息数量只有20条,人工可以逐条进行查找、比对,可是当数据规模扩展到上百条、数千条、数亿条,甚至更多时,仅仅只通过手工已经无法解决存在的问题,必须通过工具或者程序进行处理。 (2)对海量数据信息处理,还需要有良好的软硬件配置,合理使用工具,合理分配系统资源。通常情况下,如果需要处理的数据量非常大,超过了TB级,小型机、大型工作站是要考虑的,普通计算机如果有好的方法也可以考虑,如通过联机做成工作集群。 (3)对海量信息处理时,要求很高的处理方法和技巧,如何进行数据挖掘算法的设计以及如何进行数据的存储访问等都是研究的难点。 针对海量数据的处理,可以使用的方法非常多,常见的方法有Hash法、Bit-map法、Bloom filter法、数据库优化法、倒排索引法、外排序法、Trie树、堆、双层桶法以及MapReduce法。 Hash法 哈希函数的特点 哈希函数的构建方法 解决冲突的方法 Bit-map法 Bloom filter法 数据库优化法 倒排索引法 外排序法 Trie树 堆 双层桶法

Kotlin的特点及各版本新特性

自作多情 提交于 2019-12-08 14:10:39
文章地址: https://sguotao.top/Kotlin-2018-10-08-Kotlin介绍及各版本新特性.html Kotlin语言的特点 Kotlin语义是一座小岛,是一种在Java虚拟机上运行的静态类型编程语言,Kotlin的目的就是要兼具现代编程语言的所有优点,同时还要具有Java语言的跨平台性,并且要做到简洁。它也可以被编译成为JavaScript源代码。Kotlin与Java 100%兼容,能够运行在Android平台和浏览器上。 Kotlin的应用场景 1.Kotlin Script 在IntellJ Idea中创建后缀为.kts的脚本文件,可以直接运行。Gradle在3.0之后部分支持Kotlin作为其脚本语言。 2.Java虚拟机应用 常见的Web应用,JavaFx应用,Kotlin都完美支持。Kotlin非常适合开发服务器端应用程序,允许编写简洁和富有表现力的代码,同时保持与现有基于Java的技术堆栈的完全兼容性和平滑的学习曲线; 3.前端开发 Kotlin从1.1版本开始,Kotlin可以编译成JavaScript代码,运行在浏览器上。目前Kotlin已经支持ECMAScript 5.1,有计划最终支持ECMAScript 2015。 4.Android应用开发 这是Kotlin应用的主战场,Kotlin非常适合开发Android应用程序

Redis5种主要数据类型和命令

允我心安 提交于 2019-12-08 05:47:22
redis是键值对的数据库,有5中主要数据类型: 字符串类型(string),散列类型(hash),列表类型(list),集合类型(set),有序集合类型(zset) 几个基本的命令: KEYS * 获得当前数据库的所有键 EXISTS key [key …] 判断键是否存在,返回个数,如果key有一样的也是叠加数 DEL key [key …] 删除键,返回删除的个数 TYPE key 获取减值的数据类型(string,hash,list,set,zset) FLUSHALL 清空所有数据库 CONFIG [get、set] redis配置 -inf 负无穷 +inf正无穷 一:字符串类型string 字符串类型是Redis的最基本类型,它可以存储任何形式的字符串。其它的四种类型都是字符串类型的不同形式。 最基本的命令:GET、SET 语法:GET key,SET key value value如果有空格需要双引号以示区分 整数递增:INCR 语法:INCR key 默认值为0,所以首先执行命令得到 1 ,不是整型提示错误 增加指定的整数:INCRBY 语法:INCRBY key increment 整数递减:DECR 语法:DECR key 默认值为0,所以首先执行命令得到 -1,不是整型提示错误 减少指定的整数:DECRBY 语法:DECRBY key increment

Java8新特性——StreamAPI(一)

妖精的绣舞 提交于 2019-12-07 21:01:07
1. 流的基本概念 1.1 什么是流? 流是Java8引入的全新概念,它用来处理集合中的数据,暂且可以把它理解为一种高级集合。 众所周知,集合操作非常麻烦,若要对集合进行筛选、投影,需要写大量的代码,而流是以声明的形式操作集合,它就像SQL语句,我们只需告诉流需要对集合进行什么操作,它就会自动进行操作,并将执行结果交给你,无需我们自己手写代码。 因此,流的集合操作对我们来说是透明的,我们只需向流下达命令,它就会自动把我们想要的结果给我们。由于操作过程完全由Java处理,因此它可以根据当前硬件环境选择最优的方法处理,我们也无需编写复杂又容易出错的多线程代码了。 1.2 流的特点 只能遍历一次 我们可以把流想象成一条流水线,流水线的源头是我们的数据源(一个集合),数据源中的元素依次被输送到流水线上,我们可以在流水线上对元素进行各种操作。一旦元素走到了流水线的另一头,那么这些元素就被“消费掉了”,我们无法再对这个流进行操作。当然,我们可以从数据源那里再获得一个新的流重新遍历一遍。 采用内部迭代方式 若要对集合进行处理,则需我们手写处理代码,这就叫做外部迭代。而要对流进行处理,我们只需告诉流我们需要什么结果,处理过程由流自行完成,这就称为内部迭代。 1.3 流的操作种类 流的操作分为两种,分别为中间操作 和 终端操作。 中间操作 当数据源中的数据上了流水线后