Java8 新特性
Lambda表达式
语法格式:
lambda表达式的本质:作为函数式接口的实例
Lambda表达式的使用
总结:
左边:Lambda形参列表的参数类型可省略(类型推断);如果形参列表只有一个参数,其()可以省略
右边:Lambda体应该使用一对{}包裹;如果Lambda体只有一条执行语句(可能是return语句),则{}和return可以省略
eg1:无参无返回值
原:
用lambda表达式写:
eg2:Lambda需要一个参数,无返回值
语法格式3:基于类型推断,数据类型可以省略
语法格式4:Lambda只需要一个参数时,小括号可以省
语法格式5:Lambda需要两个或以上的参数,多条执行语句,并且可以有返回值
语法格式6:当lambda体只有一条,return与大括号若有,都可以省略
函数式接口
- 如果一个接口只声明了一个抽象方法,则此接口就称为函数式接口
- 可以在接口上使用
@FunctionalInterface注解
,检查此接口是否是一个函数式接口 - java.util.function包下定义了Java8的丰富的函数式接口
eg1:消费型接口
eg2:断定型接口
方法引用与构造器引用
方法引用
- 方法引用的使用情境:当要传递给Lambda体的操作已经有实现的方法了,就可以使用方法引用。
- 方法引用使用的要求:要求接口中的抽象方法的形参列表和返回值类型与方法引用的方法的形参列表和返回值类型相同
格式:
情况一:对象::实例方法
例一:Consumer
对于str->System.out.println(str)
这个lambda表达式,System.out.println(str)
这个操作已经有实现方法:PrintStream中的void println(T t)
,所以就可以把这个lambda表达式写成方法引用的形式:ps::println
例二:Supplier
情况二:类::静态方法
例一:Comparator
例二:
情况三:类::实例方法
构造器引用
和方法引用类似,函数式接口的抽象方法的形参列表和构造器的形参列表一致。
抽象方法的返回值类型即为构造器所属类的类型
数组引用
可以把数组看成一个特殊的类,就和构造器引用的写法一样
强大的StreamAPI
StreamAPI把真正的函数式编程风格引入到Java中,使用StreamAPI对集合数据进行操作,类似于使用SQL进行的数据库查询。
创建Stream
-
创建Stream方式一:通过集合
-
创建Stream的方式二:通过数组
-
创建Stream方式三:通过Stream的of()
-
创建Stream方式四:创建无限流(了解)
Stream的中间操作
多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理,而在终止操作时一次性全部处理
筛选与切片
-
filter
-
limit
输出的就是前3行的数据 -
skip
-
distinct 去重
映射
-
map
-
flatMap
相当于把接收的流都打散了
如下图 用map操作返回的是Stream<Stream<Character>>
我们要想只输出Character就要双重遍历,而用flatMap返回就直接是Stream<Character>
直接输出即可
排序
-
sorted() 自然排序
-
sorted(Comparator com) 定制排序
Stream的终止操作
终止操作会从流的流水线生成结果。其结果可以是任何不是流的值,例如List、Integer甚至是void
流进行了终止操作后不能再次使用!!
匹配与查找
-
allMatch、anyMatch和noneMatch
-
findFirst findAny
-
count、max、min
-
内部迭代
归约
收集
Collectors类的方法
想把Collector转成什么类型 就调用Collectors的什么方法
//查找工资大于6000的员工,结果返回一个list
List< Employee> employees = EmployeeData. getEmployees();
List<Employee> employeeList = employees. stream(). filter(e -> e.getSalary() >60000).collect(Collectors.toList()); // 如果要返回set则括号写 Collectors.toSet()
employeeList. forEach(System. out: :println);
Optional类
通过Optional类的方法就不用显示进行空值检测
创建Optional类对象的方法
of(T t) 的t必须非空,
empty()是创建一个空的
ofNullable(T t) 的t是可以为空
判断Optional容器中是否包含对象
获取Optional容器的对象
orElse(T other)中的参数是替补,如果调它的对象的空的,就返回这个other,这样就不会出现空指针异常的问题了。
来源:oschina
链接:https://my.oschina.net/u/4358408/blog/4697006