Lambda
省略规则
- 参数类型可以省略
- 方法体只有一句代码是大括号return和唯一一句代码的分号可以省略
- 方法只有一个参数时小括号可以省略
- 以上这些规则都记不住也可以省略不记
创建流
- 单例集合:.Stream
- 数组: Arrays.Stream; Stream.of
- 双列集合:先转换单列集合
中间操作
map把流中的元素进行计算和转换
private static void test1() { //打印所有作者 List<Author> authors = getAuthors(); authors.stream() .map(author -> author.getName()) .forEach(s -> System.out.println(s)); } private static void test2() { List<Author> authors = getAuthors(); authors.stream() .map(author->author.getAge()) .map(age -> age+10) .forEach(age -> System.out.println(age)); }
sort进行排序
distinct去重
limit设置流的长度
skip跳过流中前n个元素,返回剩下元素
flatMap:map只能把一个对象转换成另一个对象来作为流中的元素。而flatMap可以把一个对象转换成多个对象作为流中的元素(简单来说,就是把一个对象中的一个集合对象,转成集合的存储类型)
filter:筛选流中的元素,像判断语句
终止操作
- foreach:遍历
- count:统计
- max&min:求值最大或最小
- collect: 把当前流转换成一个集合
- anyMatch:判断是否有任意符合匹配条件的元素,结果为boolean类型(通俗来说,就判断是否有这个元素)
- allMatch: 判断是否都符合匹配条件(通俗来说,必须都成立)
- noneMatch:都不符合匹配条件,就是真
- findAny:获取流中的任意的一个元素,但没有办法保证获取的一定是流中的第一个元素
- findFirst: 获取第一个元素
reduce归并
对流中的数据按照你指定的计算方式计算出一个结果。(缩减操作)
reduce作用是把stream中的元素给组合起来,我们可以传入一个初始值,它会按照我们的计算方式依次拿流中的元素和初始化值进行计算,计算结果再和后面的元素计算
Optional
###Optional就好像是包装类,可以把我们的具体数据封装Optional对象内部。然后我们去使用Optional中封装好的方法操作封装进去的数据就可以非常优雅的避免空指针异常
创建对象
- ofNullable
- of
- empty
函数式接口
只有一个抽象方法的接口我们称为函数接口
JDK的函数式接口都加上了@FunctionalInterface注解进行标识。但是无论是否加上该注解只要接口中只有一个抽象方法,都是函数式接口
方法引用
我们在使用lambda时,如果方法体中只有一个方法的调用的话(包括构造方法),我们可以用方法引用进一步简化代码。
基本格式
类名或者对象名::方法名
格式 类名::方法名
使用前提
如果我们在重写方法的时候,方法体中只有一行代码,并且这行代码是调用了某个类的静态方法,并且我们把重写的抽象方法中所有的参数都按照顺序传入了这个静态方法中,这个时候我们就可以引用类的静态方法
格式 对象名::方法名
使用前提
如果我们在重写方法的时候,方法体中只有一行代码,并且这行代码是调用了某个对象的成员方法,并且我们把重写的抽象方法中所有的参数都按照顺序传入了这个成员方法中,这个时候我们就可以引用对象的实例方法
格式 类名::方法名
使用前提
如果我们在重写方法的时候,方法体中只有一行代码,并且这行代码是调用了第一个参数的成员方法,并且我们把重写的抽象方法中剩余的参数都按照顺序传入了这个成员方法中,这个时候我们就可以引用类的实例方法
格式 类名::new
使用前提
如果我们在重写方法的时候,方法体中只有一行代码,并且这行代码是调用了某个类构造方法,并且我们把重写的抽象方法中所有的参数都按照顺序传入了这个构造方法中,这个时候我们就可以引用类的构造方法