当 Java SE 8(又名核心 Java 8)在 2014 年被推出时,它引入了一些更改,从根本上影响了用它进行的编程 。这些更改中有两个紧密相连的部分:流 API 和函数式编程构造 。本文使用代码示例,从基础到高级特性,介绍每个部分并说明它们之间的相互作用 。
基础特性 流 API 是在数据序列中迭代元素的简洁而高级的方法 。包 java.util.stream 和 java.util.function 包含了用于流 API 和相关函数式编程构造的新库 。当然,代码示例胜过千言万语 。
下面的代码段用大约 2,000 个随机整数值填充了一个 List:
Random rand = new Random2();List
另外用一个 for 循环可用于遍历填充列表,以将偶数值收集到另一个列表中 。
流 API 提供了一种更简洁的方法来执行此操作:
List
这个例子有三个来自流 API 的函数:
stream 函数可以将集合转换为流,而流是一个每次可访问一个值的传送带 。流化是惰性的(因此也是高效的),因为值是根据需要产生的,而不是一次性产生的 。filter 函数确定哪些流的值(如果有的话)通过了处理管道中的下一个阶段,即 collect 阶段 。filter 函数是 高阶的(higher-order),因为它的参数是一个函数 —— 在这个例子中是一个 lambda 表达式,它是一个未命名的函数,并且是 Java 新的函数式编程结构的核心 。lambda 语法与传统的 Java 完全不同:
n -> (n & 0x1) == 0
箭头(一个减号后面紧跟着一个大于号)将左边的参数列表与右边的函数体分隔开 。参数 n 虽未明确类型,但也可以明确 。在任何情况下,编译器都会发现 n 是个 Integer 。如果有多个参数,这些参数将被括在括号中,并用逗号分隔 。
在本例中,函数体检查一个整数的最低位(最右)是否为零,这用来表示偶数 。过滤器应返回一个布尔值 。尽管可以,但该函数的主体中没有显式的 return 。如果主体没有显式的 return,则主体的最后一个表达式即是返回值 。在这个例子中,主体按照 lambda 编程的思想编写,由一个简单的布尔表达式 (n & 0x1) == 0 组成 。
collect 函数将偶数值收集到引用为 evens 的列表中 。如下例所示,collect 函数是线程安全的,因此,即使在多个线程之间共享了过滤操作,该函数也可以正常工作 。方便的功能和轻松实现多线程 在生产环境中,数据流的源可能是文件或网络连接 。为了学习流 API, Java 提供了诸如 IntStream 这样的类型,它可以用各种类型的元素生成流 。这里有一个 IntStream 的例子:
推荐阅读
- 教你使用这两个excel自动排名函数 excel按分数高低排序怎么排
- believe in的用法解析 believein
- 解析void函数应用 void函数已有主体怎么解决
- 似shi和si的用法 似的多音字
- apply的用法和搭配 call和apply的区别是什么
- Excel做复利终值系数表 excel复利计算函数
- 初中二次函数的图象与性质 二次函数判别式的意义
- left函数用法与理解 left函数
- 常用函数汇总学习 mysql绝对值函数
- java字符串截取方法 java字符串分割函数