1 简述
公司自年初终于开始使用java8作为项目的标准jdk,在开发过程中,逐渐认识到java8的很多新特性,确实很方便.其中内容的核心,在于函数式编程,即将函数本身作为对象参数去处理.其中涉及到三个关键新特性:
- lambda表达式(及函数式接口)
- stream
- 方法引用
这三个新特性的使用是相辅相成的,特别是前两者,作为本文的重点来说.
参考链接:
2 新特性的适用场景
lambda表达式,就我现在的使用经验,其实就是与JavaScript中的箭头函数是一样的.只不过js一直都支持将函数看做是对象参数,所以箭头函数对js更像一个语法糖.但lambda表达式对于java的改变就重要很多了,直接允许了函数式编程,这是此前版本所无法实现的.
lambda表达式最常见的使用场景是和stream一同使用.stream的详细介绍建议阅读参考链接了解.虽然适用于很多种类型,但在开发项目时,用到最多的,还是集合.
//演示代码
List<String> output = wordList.stream().
map(str->str.toUpperCase.
collect(Collectors.toList());
以下是我对比java8和js集合中的方法,列举的一个表格(可以看到,js此前有的方便方法,java8基本都能做到):
streamType
java8
js
作用
intermediate
map
map
将stream中的每一个元素,映射为另外一个元素
intermediate
flatMap
flat,flatMap
将stream中的层次结构扁平化
intermediate
filter
filter
对每一个元素进行测试,通过测试的元素留下来
terminal
forEach
forEach
对每一个元素执行操作
intermediate
peek
无
对每一个元素执行操作
terminal
findFirst
find
查找符合条件的第一个元素
terminal
reduce
reduce
依序将元素组合起来得到一个新的值
intermediate
limit
slice
返回前n个元素
intermediate
skip
slice
跳过前n个元素(返回剩下的元素)
intermediate
sorted
sort
对元素进行排序
terminal
min
无
最小值
terminal
max
无
最大值
intermediate
distinct
无
去除重复值
terminal
allMatch
every
全部元素符合
terminal
anyMatch
some
任一元素符合
terminal
noneMatch
无
没有元素符合
以上仅为常用方法.streamType表示的是流操作的类型,intermediate类型操作后仍可继续按照流操作,terminal类型操作则会终止流操作.
参考链接:
3 方法引用
方法引用本身是语法糖,它将箭头函数表示的方法引用,改用"::"替代.
注意,这里说的是方法引用,而不是方法本身,即将
stream.map(str->str.toUpperCase)
用
stream.map(String::toUpperCase)
来替换.