转载一个系列的文章,原文作者总结的很清晰
原文地址:点击打开链接
Java8的lambda总结
一,lambda表达式可以理解为一种匿名函数:它没有名称,但是有参数列表,函数主体,返回值类型,甚至可能还有可以抛出的异常的列表
二,lambda表达式可以让你简洁的完成函数参数化
三,函数式接口就是有且仅有一个抽象方法的接口
四,只有在接受函数式接口的地方才能使用lambda表达式
五,lambda表达式允许你直接内联,为函数式接口的抽象方法提供实现,并且将整个表达式作为函数式接口的一个实例
六,java8自带了一些常用的函数式接口.在Java.util.function包下
七.为了避免装箱拆箱操作,对上述提到的常用装箱函数式接口,java8为其提供了原始类型的接口:IntPredicate 等等..
八,环绕执行模式可以配置lambda表达式提高代码的灵活性和可重用性
九,lambda表达式所需要代码的类型称为目标类型
十,方法引用可以让你重复使用现有的方法实现并直接传递他们
十一,compartor,Predicate以及function等函数式接口都有几个可以用来结合lambda表达式的默认方法
Java8 Stream的总结
一,Stream API 可以表达复杂的数据处理查询.常用操作如下
操作 |
类型 |
返回类型 |
函数式接口 |
函数描述符 |
filter |
中间 |
Stream<T> |
Predicate<T> |
T->Boolean |
distinct |
中间-有状态 |
Stream<T> |
|
|
Skip |
中间-有状态 |
Stream<T> |
Long |
|
Limit |
中间-有状态 |
Stream<T> |
Long |
|
Map |
中间 |
Stream<T> |
Function<T,R> |
T->R |
Flatmap |
中间 |
Stream<T> |
Function<T,Stream<R>> |
T->Stream<R> |
Sorted |
中间-有状态 |
Stream<T> |
Compartor<T> |
(T,T)->int |
anyMatch |
终端 |
Boolean |
Predicate<T> |
T->Boolean |
noneMatch |
终端 |
Boolean |
Predicate<T> |
T->Boolean |
allMatch |
终端 |
Boolean |
Predicate<T> |
T->Boolean |
findAny |
终端 |
Optional<T> |
|
|
findFirst |
终端 |
Optional<T> |
|
|
forEach |
终端 |
Void |
Consumer<T> |
T->void |
Collect |
终端 |
R |
Collector<T,A,R> |
|
Reduce |
终端-有状态 |
Optional<T> |
BinaryOperator<T> |
(T,T)->T |
Count |
终端 |
Long |
|
|
二,可以使用filter,distinct,skip和limit对流进行筛选和切片
三,可以使用map和flatMap提取或转换流中的元素
四.可以使用findFirst和findAny方法查找流中的元素.你可以用allMatch,noneMatch和anyMatch方法让流匹配给定的谓语
五,上述方法都利用了短路:找到结果就立刻停止计算,并没有必要处理整个流
六,可以利用reduce方法将流中的所有元素迭代合并成一个结果,例如求和或者查询最大的元素
七,filter和map等操作都是无状态的,他们并没有储存任何状态.reduce等操作要储存状态才能计算出一个值.sorted和distinct等操作也要储存状态,因为他们需要把流中的所有元素缓存起来才能返回一个新的流.这种操作称为有状态操作.
八.流有三种基本原始类型特化:intStream,doubleStream和LongStream.他们的操作也有相应的特化
九,流不仅可以从集合创建,也可以从值,数组,文件以及iterate与generate等特定方法创建
Java8 collect总结
一,collect是一个终端操作,它接收的参数是将流中的元素累积到汇总结果的各种方式(称为收集器)
二,预定义收集器包括将流元素归约和汇总到一个值.如下
工厂方法 |
返回类型 |
用于 |
toList |
List<T> |
把流中所有元素收集到List中 |
示例:List<Menu> menus=Menu.getMenus.stream().collect(Collector.toList()) |
||
toSet |
Set<T> |
把流中所有元素收集到Set中,删除重复项 |
示例:Set<Menu> menus=Menu.getMenus.stream().collect(Collector.toSet()) |
||
toCollection |
Collection<T> |
把流中所有元素收集到给定的供应源创建的集合中 |
示例:ArrayList<Menu> menus=Menu.getMenus.stream().collect(Collector.toCollection(ArrayList::new)) |
||
Counting |
Long |
计算流中元素个数 |
示例:Long count=Menu.getMenus.stream().collect(counting); |
||
SummingInt |
Integer |
对流中元素的一个整数属性求和 |
示例:Integer count=Menu.getMenus.stream().collect(summingInt(Menu::getCalories)) |
||
averagingInt |
Double |
计算流中元素integer属性的平均值 |
示例:Double averaging=Menu.getMenus.stream().collect(averagingInt(Menu::getCalories)) |
||
Joining |
String |
连接流中每个元素的toString方法生成的字符串 |
示例:String name=Menu.getMenus.stream().map(Menu::getName).collect(joining(“, ”)) |
||
maxBy |
Optional<T> |
一个包裹了流中按照给定比较器选出的最大元素的optional |
示例:Optional<Menu> fattest=Menu.getMenus.stream().collect(maxBy(Menu::getCalories)) |
||
minBy |
Optional<T> |
一个包裹了流中按照给定比较器选出的最大元素的optional |
示例: Optional<Menu> lessest=Menu.getMenus.stream().collect(minBy(Menu::getCalories)) |
||
Reducing |
归约操作产生的类型 |
从一个作为累加器的初始值开始,利用binaryOperator与流中的元素逐个结合,从而将流归约为单个值 |
示例:int count=Menu.getMenus.stream().collect(reducing(0,Menu::getCalories,Integer::sum)); |
||
collectingAndThen |
转换函数返回的类型 |
包裹另一个转换器,对其结果应用转换函数 |
示例:Int count=Menu.getMenus.stream().collect(collectingAndThen(toList(),List::size)) |
||
groupingBy |
Map<K,List<T>> |
根据流中元素的某个值对流中的元素进行分组,并将属性值做为结果map的键 |
示例:Map<Type,List<Menu>> menuType=Menu.getMenus.stream().collect(groupingby(Menu::getType)) |
||
partitioningBy |
Map<Boolean,List<T>> |
根据流中每个元素应用谓语的结果来对项目进行分区 |
示例:Map<Boolean,List<Menu>> menuType=Menu.getMenus.stream().collect(partitioningBy(Menu::isType)); |
三,预定义收集器可以用groupby对流中元素进行分组或者用partitioningBy进行分区
四,收集器可以高效的复合起来,进行多级分组,多级分区和归约
五,可以自己实现collector接口进行定义自己的收集器