美文网首页
极客时间第13天打卡

极客时间第13天打卡

作者: 随手点灯 | 来源:发表于2020-04-11 21:14 被阅读0次

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表达式的语法格式:

  1. 无参,无返回值,Lambda 体只需一条语句
Runnable r = () -> System.out.print("hello world");
  1. Lambda 需要一个参数
Comsumer<String> con = (x) -> System.out.print(x);
  1. Lambda 只需要一个参数时,参数的小括号可以省略
Comsumer<String> con = (x) -> System.out.print(x);
  1. Lambda 需要两个参数,并且有返回值
BinaryOperator<Long> bo = (x,y) -> {
    return x + y;
}
  1. 当 Lambda 体只有一条语句时,return 与大括号可以省略
BinaryOperator<Long> bo = (x,y) -> x+y;
  1. 参数类型可以省略.因为编辑器可以通过上下文进行腿短数据的格式.

什么是函数式接口呢.就是只有一个抽象方法的接口,并且可以使用@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;
    }

}

相关文章

  • 极客时间第2天打卡

    打卡内容

  • 极客时间第3天打卡

    今天学习了争哥的行为型设计模式. 观察者设计模式:同步的,异步的,同一个进程的,不同进程之间都可以用到观察者模式....

  • 极客时间第5天打卡

    打卡 今天学习了争哥的数据算法之美,链表的相关知识. 过去我对算法几乎是不太懂的,,争哥的算法教程写的很好. 而且...

  • 极客时间第1天打卡

    修改前 今天主要学习的是郑晔老师的10x程序员工作法,里面关于结构化思维,顺便了解了李忠秋老师的结构化思维,其实这...

  • 极客时间第7天打卡

    打卡 今天学习了<>里面提到了gap锁,以前基本不懂什么是gap锁,现在明白一些些了. gap...

  • 极客时间第13天打卡

    JDK1.8新特性 不知道为啥我们公司出了个脑残的规定,不要在代码中使用Lambda表达式,后来参加一次阿里的代码...

  • 极客时间第8天打卡

    今天学习的是mysq45讲 主要是讲锁规则.主要有以下5条锁规则,两个原则,两个优化,一个bug 原则1: 如果是...

  • 极客时间每日打卡小记

    最近在极客时间APP上参加21天打卡活动,虽说21天是否能养成习惯还不确定,但坚持了5天下来,有些收获,和你分享一...

  • 极客时间11天打卡

    今天学习的设计模式之美的迭代器模式,主要分了三篇来讲. 一般情况下,迭代器模式都是一门编程语言提供了,用来遍历基本...

  • 极客时间-技术编程类课程产品分析报告

    【极客时间】 极客时间是极客邦科技出品的IT类知识服务产品,内容包含专栏订阅、极客新闻、热点专题、直播、视频和音频...

网友评论

      本文标题:极客时间第13天打卡

      本文链接:https://www.haomeiwen.com/subject/tzepmhtx.html