Java8新特性
Lambda表达式的使用
-
举例:
(o1,o2) -> Integer.compare(o1,o2);
-
格式:
-> :lambda操作符 或 箭头操作符
-> 左边:lambda形参列表(其实就是接口中抽象方法的形参列表)
-> 右边:lambda体(其实就是重写的抽象方法的方法体)
-
lambda表达式的使用:(分为6种情况介绍)
- 语法格式一:无参,无返回值
Runnable r = () -> System.out.println("nanfeng")
- 语法格式二:需要一个参数,但是没有返回值
Consumer<String> con = (s) -> {System.out.println(s);} con.accept("nanfeng")
- 语法格式三:数据类型可以省略,因为可由编译器推断得出,称为“类型推断”
- 语法格式四:lambda若只需要一个参数时,参数的小括号也可以省略
- 语法格式五:lambda需要两个或以上的参数,多条执行语句,并且可以有返回值
Comparator<Integer> com = (o1,o2) -> { Integer.compare(o1,o2); return o1.compare(o2); }
- 语法格式六:当lambda体只有一条语句时,return与大括号若有,都可以省略
Comparator<Integer> com = (o1,o2) -> o1.compare(o2);
-
lambda表达式的本质:作为接口的实例
-
如果一个接口中,只声明了一个抽象方法,则此接口就称为函数式接口
方法引用与构造器引用
方法引用的使用
- 使用情境:当传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用。
方法引用本质上就是lambda表达式,而lambda表达式作为函数式接口的实例。所以方法引用,也是函数式接口的实例。
使用格式: 类(或对象) :: 方法名
方法引用使用的要求:要求接口中的抽象方法的形参列表和返回值类型与方法引用的方法的形参列表和返回值类型相同。
具体分为如下三种情况:
对象::非静态方法
Consumer 中的void accept(T t), PrintStream中的void println(T t) Consumer<String> con = System.out::println; con.accept(“nanfeng”);
类::静态方法
Comparator 中的int compare(T t1,T t2), Integer中的int compare(T t1,Tt2) Comparator<Integer> com = Integer::compare;
类::非静态方法
Comparator 中的 int compare(T t1,T t2); String 中的 int t1.comapre(t2); Comaprator<String> com = String :: compareTo;
构造器的引用
Supplier中的 T get() Employee的空参构造器 Employee() Supplier<Employee> sup = Employee::new
和方法引用类似,函数式接口的抽象方法的形参列表和构造器的形参列表一致。抽象方法的返回值类型即为构造器所属的类的类型。
Stream的中间操作
- 筛选与切片
方法 | 描述 |
---|---|
filter(Predicate p) | 接收lambda,从流中排除某些元素 |
distinct() | 筛选,通过流所生成元素的hashCode()和equals()去除重复元素 |
limit(long maxsize) | 截断流,使其元素不超过给定数量 |
skip(long n) | 跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流。与limit(n)互补/ |
- 映射
方法 | 描述 |
---|---|
map(Function f) | 接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。 |
flatMap(Function f) | 接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连成一个流。 |
- 排序
方法 | 描述 |
---|---|
sorted() | 产生一个新流,其中按自然顺序排序 |
sorted(Comparator com) | 产生一个新流,其中按比较器顺序排序 |
Stream的终止操作
- 匹配与查找
方法 | 描述 |
---|---|
allMatch(Predicate p) | 检查是否匹配所有的元素 |
anyMatch(Predicate p) | 检查是否至少匹配一个元素 |
findFirst | 返回第一个元素 |
findAny | 返回当前流中的任意元素 |
count | 返回流中元素的总个数 |
max(Comparator c) | 返回流中最大值 |
- 规约
方法 | 描述 |
---|---|
reduce(T identity, BinaryOperator) | 可以将流中元素反复结合起来,得到一个值,返回T |
reduce(BinaryOperator) | 可以将流中元素反复结合起来,得到一个值。返回Optional |
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
list.stream().reduce(0,Integer::sum);
- 收集
方法 | 描述 |
---|---|
collect(Collector c) | 将流转换为其他形式。接收一个Collector接口的实现,用于给Stream中元素做汇总的方法 |
Collector接口中方法的实现决定了如何对流执行收集的操作(如收集到List,Set,Map)
Collectors实用类提供了很多静态方法,可以方便地创建常见收集器实例
Optonal类
Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
Optional 类的引入很好的解决空指针异常。
序号 | 方法 & 描述 |
---|---|
1 | **T get()**如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException |
2 | **boolean isPresent()**如果值存在则方法会返回true,否则返回 false。 |
3 | **static Optional of(T value)**返回一个指定非null值的Optional。 |
4 | **static Optional ofNullable(T value)**如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。 |
5 | **T orElse(T other)**如果存在该值,返回值, 否则返回 other (ofElse方法中的参数)–备胎。 |