不知道从什么时候开始. Java8开始刮起了一阵妖风. 那就是lamda表达式. 也叫函数式编程, 大概是和隔壁的Scala进行学习吧. 但是Java8也是甲骨文最后一个免费的版本. 大概率, 很多的中小型公司都会选择停留在这个版本. 虽然这个版本没有ZGC垃圾回收, 但是面对10G-100G左右内存规模的程序, 也应该够了.
lamda表达式最大的特性就是简化了for循环的编写方式. 多说无益, 我们举个例子进行编写吧.
List<Integer> helloArrayList = new ArrayList<>(); for(String str : helloArratList){ str = str+"a"; }
List<Integer> helloArrayList = new ArrayList<>(); // 注意lamda表达式中map处理完之后要使用collect收集. 并且赋值回去. helloArrayList = helloArrayList.stream().map(str -> str+"a").collect(Collections.toList());
这样看起来是不是很简单? 好像也不是… 但是当多个算子聚合操作的时候, 你会感觉出来的. 特别其还有一些比较喜欢的Map转换器
.
差点忘了这一部分. 我们初学者写的时候非常苦恼. 其中的表达式有三种变种. 我们需要熟悉他们:
map(a -> b)
这部分的算子一般比较简单. 一行代码即可通过.
map(a -> {return a+b;})
这种一般适合复杂的计算. 比如:
map(a -> { a = a+1; int. b. = 2; a = a+b; return a; })
filter(Objects::notNull)
. 其实你不熟悉这种, 也无所谓. 能看懂即可.在这里给出一些, 我在工作中使用比较多的算子.
map()
大名鼎鼎的map()
算子. map
通常的写法为xxx.stream().map(object -> objectxxxxx);
值得注意的是, 我初始的时候并不知道object
这个变量写什么好. 其实, 写多了之后, 会发现, 其可以任意指定. 其次, 当做业务开发时, 这个值最好和业务相关的. 比如bookArrayList.stream().map(book -> { return abc;})
collect()
这个算子中方法的变种比较多. 比如:
List<>abcList
.Map<keyType, valueType> map
. 这种需要注意map出现key重名情况. 获取key有时也有传递方法体的. 例如: collect(Collectors.toMap(Object::getHashCode ,a->a,(a1,a2)->a1))
collect(Collectors.toMap(a.key ,a->a,(a1,a2)->a1))
.Map<keyType, List<valueType>>
. 注意, 这种是不需要考虑key重名的情况的.filter()
过滤器