JDK1.8新特性
不知道为啥我们公司出了个脑残的规定,不要在代码中使用Lambda表达式,后来参加一次阿里的代码评审,是建议用StreamAPI来做代码优化的.
这就是外包公司和大厂的区别,大厂是拥抱变化的.
同时,我们在规划自己的学习的时候,一定要把大量的时间放到基础夯实上,基础打牢固了,上层建筑才不会垮,现在我要重新学习一遍JDK1.8新特性.
01 JDK1.8的性能优化(速度更快)
JDK1.8在性能优化上面,主要是两个,HashMap,ConcurrentHashMap和JVM内存优化.
HashMap的底层实现是数组+链表的格式,但是如果出现了Hash碰撞之后,链表越来越长,再次查询一个值,就会出现时间复杂度的变高,所以当链表的值变到8的时候,链表就会转成红黑树.红黑树的性能除了增加之外,其他性能都得到了大大的提升.
对于concurrenthashMap.1.7是采用锁分段的机制,1.8中是使用的底层的CAS的方法实现无锁同步.CompareAndSwap.性能也大大提升.
对于JVM,在1.8之前,方法区是放到对内存的永久区当中,但是到了1.8之后,就彻底剥离出来,形成了一个元空间.
这就是性能方面的优化.
02 Lamda表达式(代码更少)
提到1.8就不得不提到Lamda表达式.
在JDK1.8当中新增了操作符 -> ,在操作符的左侧是参数,右侧是方法执行体.
通常Lamda表达式和函数式接口配合使用.
Lamda表达式的语法格式:
- 无参,无返回值,Lambda 体只需一条语句
Runnable r = () -> System.out.print("hello world");
- Lambda 需要一个参数
Comsumer<String> con = (x) -> System.out.print(x);
- Lambda 只需要一个参数时,参数的小括号可以省略
Comsumer<String> con = (x) -> System.out.print(x);
- Lambda 需要两个参数,并且有返回值
BinaryOperator<Long> bo = (x,y) -> {
return x + y;
}
- 当 Lambda 体只有一条语句时,return 与大括号可以省略
BinaryOperator<Long> bo = (x,y) -> x+y;
- 参数类型可以省略.因为编辑器可以通过上下文进行腿短数据的格式.
什么是函数式接口呢.就是只有一个抽象方法的接口,并且可以使用@FunctionalInterface注解进行标记.
java中的四大函数式接口:
Consumer<T>
Supplier<T>
Function<T,R>
Predicate<T>
03 方法引用和构造器的引用
JDK1.8中的方法引用简写:
如果函数式接口的内容已经是有现成的实现方法了,那么就可以使用方法引用,主要有下面几种格式:
要求: 现成的这个方法的参数名和返回值必须和函数式接口的参数名和返回值一模一样.
对象::实例方法
Employee emp = new Employee();
Supplier<String> su = () -> emp.getName();
Supplier<String> su2 = emp::getName;
类::静态方法
String str = "123";
Function<String,Integer> fu1 = (x) -> Integer.valueOf(x);
Function<String,Integer> fu2 = Integer::valueOf;
类::实例方法
特例: 如果有两个参数,函数体中第一个参数是调用者,第二个参数是第一个参数调用方法的参数,那么可以使用类::实例方法的形式
BiFunction<Integer,Integer, Boolean> f1 = (x,y) -> x.equals(y);
BiFunction<Integer,Integer,Boolean> f2 = Integer::equals;
JDK1.8中的构造器引用:
格式: ClassName::new
要求: 构造方法的参数数量和返回值要和函数式接口的参数和返回值一样:
public class Test {
public static void main(String[] args) {
Supplier<Employee> su1 = Employee::new;
BiFunction<Integer,String,Employee> su2 = Employee::new;
}
}
@Data
class Employee {
private Integer id;
private String name;
public Employee() {
}
public Employee(Integer id, String name) {
this.id = id;
this.name = name;
}
public Employee(Integer id) {
this.id = id;
}
}
网友评论