Java8新特性
2021/03/29 11:16 分类: 技术交流 浏览:0
Java8新特性
一:概念
Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8,它发布一些新特性
- Lambda表达式 − Lambda允许把函数作为一个方法的参数函数作为参数传递进方法中
- 方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码
- 默认方法 − 默认方法就是一个在接口里面有了一个实现的方法
- Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中
- Date Time API − 加强对日期与时间的处理
- Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常
二:函数式接口
在接口里面只有一个抽象方法的接口,就叫做函数式接口,也可以使用@FunctionalInterface来标记(注意:不管用不用该注解标记,它也是一个函数式接口)
@FunctionalInterface public interface MyFun { void show(); } |
三:Lambda表达式
- 语法格式
<函数式接口> <变量名> = (参数1,参数2...) -> { //方法体 } |
- 调用无参方法并且无返回值
@FunctionalInterface public interface MyFun { void show(); } |
MyFun f = ()->System.out.println(“AAA”); f.show(); |
- 调用无参方法并且有返回值
@FunctionalInterface public interface MyFun { int add(); } |
MyFun f = ()->3+2; f.add(); 注意:如果在代码块中只有一句代码,{}和return语句都是可以省略的 |
- 调用多个参数的方法
@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程序员的生产力,让程序员写出高效率、干净、简洁的代码。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等
二:操作流的步骤和示例
- 创建流
- 中间操作
- 终止操作
filter--》接收Lambda,从流中排除一些元素 limit--->截断流,使其元素不超过给定的数量 skip(n)--->跳过元素,若流中元素不足n个,则返回一个空流,与limit(n)互补 distinct--》去重,通过元素hashCode和equals来判断的 |
List<Employee> emps = Arrays.asList(new Employee("张三", 22, 1.5), 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<Employee> employees= emps.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); |
sort 自然排序 sort(Comparator c) 定制排序 |
List<String> list = Arrays.asList("CCC","BBB","AAA","DDD"); list.stream().sorted().forEach(System.out::println); |
List<Employee> emps = Arrays.asList(new Employee("张三", 22, 1.5), 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); |
赞 0