十一、JDK8新特性
1. Lambda表达式
作用: 用于简化匿名内部类的代码写法!只能简化函数式接口的匿名内部类!!
格式:
(被重写方法的形参列表) -> {
被重写方法的方法体代码
}
什么是函数式接口?
- 有且仅有一个抽象方法的接口
- 有@FunctionalInterface的注释的接口一定是函数式接口
public class LambdaTest1 {
public static void main(String[] args) {
Animal a = new Animal() {
@Override
public void run() {
System.out.println("狗跑的贼快~~");
}
};
a.run();
// 注意:Lambda表达式不是能简化全部匿名内部类,只能简化函数式借口的匿名内部类:接口有且仅有一个函数
// Animal a2 = () -> {
// System.out.println("fff");
// };
Swinmming s = new Swinmming() {
@Override
public void swim() {
System.out.println("东北怪鸽swim");
}
};
Swinmming s1 = () -> {
System.out.println("wo swim");
};
s1.swim();
}
}
abstract class Animal{
public abstract void run();
}
interface Swinmming{
void swim();
}
Lambda表达式的省略写法:
- 参数类型可以省略不写
- 如果只有一个参数,参数类型可以省略,同时()也可以省略
- 如果Lambda表达式中的方法体代码只有一行代码,可以省略大括号不写,同时要省略分号!此时,如果这行代码是return语句,也必须去掉return不写。
2. 方法引用
继续简化Lambda表达式
标志符号: “::”
场景:
静态方法引用: 类名::静态方法
实例方法引用: 对象名::实例方法
特定类型方法的引用: 类型::方法
构造器引用: 类名::new
3. Stream
可以用于操作集合或数组数据
优势:Stream流大量结合了Lambda的语法风格来编程,代码更简洁,可读性更好
认识Stream
概念: JDK8开始新增的一套API,可以用来操作集合或者数组的数据
优势: 结合了大量的Lambda的语法风格来编程,提供了更强大、更简单的方式操作集合或者数组中的数据——代码更简洁、可读性更好
public class StreamTest1 {
public static void main(String[] args) {
// 找出list中姓"张"且长度为3的名字
List<String> list = new ArrayList<>();
// 添加元素
Collections.addAll(list, "张三丰", "张无极", "周周", "赵敏", "张强");
System.out.println(list);
// 常规方法
List<String> list2 = new ArrayList<>();
for (String s : list) {
if (s.startsWith("张") && s.length() == 3) {
list2.add(s);
}
}
System.out.println(list2);
// Stream流
List<String> list3 = list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).collect(Collectors.toList());
System.out.println(list3);
}
}
使用步骤
获取Stream流:
- 集合(Collection)——default Stream stream();Map集合可以把键和值都转换称Collection,然后使用stream方法
- 数组——Arrays工具类中public static Stream stream(T[] array);Stream类中的方法public static Stream of(T…values)
Stream流的中间方法:* 调用完成后会返回新的Stream流,可以继续使用(支持链式编程)
Stream流的终结方法:
调用完成之后,不会返回新Stream了
收集Stream流——把Stream流操作后的结果转回到集合或者数组中返回 《流只能收集一次》