Java8 新特性
Java8 : 新特性
写在前面
对于 Lambda 表达式、Stream 流的好奇源于一道算法题的惊艳解法。
题目
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。 由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
如果不存在则输出0。
我的解法
1 | public class Solution { |
三行代码
1 | public int MoreThanHalfNum_Solution(int [] array) { |
从以上的代码可以看出来,Java8 新特性所展现出来的简洁性与优雅性令人印象深刻。
关于新特性
相信很多同学在刷算法题的时候都会遇到排序的问题,特别是对 ArrayList
的排序,如果在题目没有明确要考察排序算法的情况下大多数同学都会用到 Collections.sort()
函数,一般情况下只需要直接把 ArrayList
放进去就可以了,但是在复杂情况下是需要自行定义 Compartor
接口的,而在这时使用新特性可大大简化冗余的代码。
1 | /* 例如: |
关于 Lambda 表达式
- Lambda表达式专门针对只有一个方法的接口。
- 不细展开,面向日常使用的有如下用法。
1 | /* |
关于 Stream 流
获取流
List
集合类可以直接用list.stream()
获取流。Arrays
数组可以使用Arrays.stream(array)
获取流。
中间操作
filter(lambda)
将结果为 false
的元素过滤掉map(lambda)
转换元素的值flatMap(fun)
多对多转换元素的值limit(n)
保留前 n 个元素skip(n)
跳过前 n 个元素distinct()
去重元素sorted()
将 Comparable
元素的流排序sorted(lambda)
将流元素排序
终结操作
约简操作
max(lambda)
最大值min(lambda)
最小值count()
统计数量findFirst()
返回第一个元素findAny()
返回任意元素anyMatch(Predicate)
任意元素匹配时返回 true
allMatch(Predicate)
所有元素匹配时返回 true
noneMatch(Predicate)
没有元素匹配时返回 true
收集操作
iterator()
迭代器forEach(fun)
遍历元素作为 fun
方法入参toArray()
转化为数组toArray(T[] :: new)
转换为指定类型后转化为数组collect(Collector)
使用 Collector
收集器收集元素
收集器
Collectors.toList()
Collectors.toSet()
Collectors.toMap(fun1, fun2)
总结
1 | public int MoreThanHalfNum_Solution(int [] array) { |
回到开篇的三行代码,分析最后一行,可以看出此处使用 IntStream.of(array)
获取流,换成Arrays.stream(array)
也可以,然后 filter(k->k==i).count()
找出所有等于数组中间元素的数并统计个数,最后是一个三目运算符,累计个数 > 一半元素为 true
则输出该元素 i
,否则输出 0
。
搜索了很久,没有找到其他的使用 Stream 做的算法题,可能这种方法对算法题并没有什么提升吧 hhh。如果同学们发现有使用 Stream 做起来很方便的题目也可以发到我的邮箱一起交流 `ericwongmoon@outlook.com` 。