一:概念
Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8,它发布一些新特性
1.Lambda表达式 − Lambda允许把函数作为一个方法的参数函数作为参数传递进方法中
2.方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码
3.默认方法 − 默认方法就是一个在接口里面有了一个实现的方法
4.Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中
5.Date Time API − 加强对日期与时间的处理
6.Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常
二:函数式接口
在接口里面只有一个抽象方法的接口,就叫做函数式接口,也可以使用@FunctionalInterface来标记(注意:不管用不用该注解标记,它也是一个函数式接口)
@FunctionalInterface
public interface MyFun {
void show();
}
三:Lambda表达式
1.语法格式
<函数式接口> <变量名> = (参数1,参数2...) -> {
//方法体
}
2.调用无参方法并且无返回值
@FunctionalInterface
public interface MyFun {
void show();
}
MyFun f = ()->System.out.println(“AAA”);
f.show();
3.调用无参方法并且有返回值
@FunctionalInterface
public interface MyFun {
int add();
}
MyFun f = ()->3+2;
f.add();
注意:如果在代码块中只有一句代码,{}和return语句都是可以省略的
4.调用多个参数的方法
@FunctionalInterface
public interface MyFun {
int add(int a,int b);
}
MyFun f = (a,b)->a+b;
f.add(2,3);
注意:如果在代码块中只有一句代码,{}和return语句都是可以省略的,并且在参数列表那里不需要定义数据类型,它会自动推算参数类型
三:方法引用
一:实例方法引用
@FunctionalInterface
public interface MyFun {
void printString(String str);
}
MyFun f = System.out::println;
f.printString(“abc”);
注意:如果要使用方法引用, 抽象方法和参数列表和返回值类型,要和被调用方的方法形参列表和返回值类型一致才可以使用
二:构造方法引用
@FunctionalInterface
public interface MyFun {
Student createStudent();
}
MyFun f = Student::new;
注意:它会去调用无参数的构造方法,因为该抽象方法,参数列表是无参的,所以映射下来,也是调用无参数的构造方法,如果抽象方法,形参列表有多个,它也会去调用对应的有参数构造方法
三:静态方法引用
@FunctionalInterface
public interface MyFun {
int parseInt(String str);
}
MyFun f = Integer::parseInt;
注意:如果要使用方法引用, 抽象方法和参数列表和返回值类型,要和被调用方的方法形参列表和返回值类型一致才可以使用
四:Stream流
一:概念
Stream(流)是一个来自数据源的元素队列并支持聚合操作,Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等
二:操作流的步骤和示例
1.创建流
2.中间操作
3.终止操作
filter--》接收Lambda,从流中排除一些元素
limit--->截断流,使其元素不超过给定的数量
skip(n)--->跳过元素,若流中元素不足n个,则返回一个空流,与limit(n)互补
distinct--》去重,通过元素hashCode和equals来判断的
List
new Employee(\"李四\ 12, 1.6),
new Employee(\"王五\ 32, 1.7),
new Employee(\"王天霸\ 52, 1.8),
new Employee(\"李日勾\ 12, 1.9),
new Employee(\"王天霸\ 22, 1.3),
new Employee(\"王天霸\ 22, 1.3));
Stream
.filter(t->t.getAge()>=22) //过滤,年龄大于22
.skip(1)//跳过第一条数据
.distinct();//去重
employees.forEach(System.out::println);
map 方法用于映射每个元素到对应的结果
emps.stream().map(Employee::getName).forEach(System.out::println);
打印emps里面所有的姓名
sort 自然排序
sort(Comparator c) 定制排序
List
list.stream().sorted().forEach(System.out::println);
List
new Employee(\"李四\ 12, 1.6),
new Employee(\"王五\ 32, 1.7),
new Employee(\"王天霸\ 52, 1.8),
new Employee(\"李日勾\ 12, 1.9),
new Employee(\"王天霸\ 22, 1.3),
new Employee(\"王天霸\ 22, 1.3));
emps.stream().sorted((o1,o2)->{
if(o1.getAge().equals(o2.getAge())){
return o1.getName().compareTo(o2.getName());
}
return o1.getAge().compareTo(o2.getAge());
}).forEach(System.out::println);