首页 > 编程语言 >Java8学习笔记

Java8学习笔记

时间:2023-01-29 08:55:25浏览次数:59  
标签:静态方法 接口 学习 匿名 默认 笔记 方法 Java8 Lambda

Oracle JDK是基于Open JDK源代码的商业版本,要学习Java新技术可以去OpenJDK官网学习。

Lambda表达式介绍

  • 匿名内部类存在的问题

    • new Thread(new  Runnable() {
          @Override
          public void run() {
              // ...
          }
      }).start();
      
    • 匿名内部类做了哪些事

      • 定义了一个没有名字的类
      • 实现了Runnable接口
      • 创建了这个类的对象
    • 其实我们最关注的是run方法和里面要执行的代码,使用匿名内部类语法是很冗余的

    • Lambda体现的是函数式编程思想,只需要将要执行的代码放到函数中

    • Lambda就是一个匿名函数,我们只需要将要执行的代码放到Lambda表达式中即可

  • 体验Lambda表达式

    • new Thread(() -> {
          //...
      }).start();
      
    • 好处:

      • 简化匿名内部类,让代码更加精简

Lambda的标准格式

  • Lambda表达式是一个匿名函数,而函数相当于Java中的方法

    • (参数列表) -> {
          
      }
      
    • ():参数列表

    • {}:方法体

    • ->:没有实际含义,起到连接的作用

  • 小结:

    • 以后看到方法的参数是接口就可以考虑使用Lambda表达式
    • 可以这么认为:Lambda表达式就是对接口中抽象方法的重写
    • 不是所有匿名内部类都能用Lambda来替换

Lambda的实现原理

  • 匿名内部类在编译的时候会形成一个.class文件
  • Lambda在程序运行时会形成一个类
    • 在类中新增一个方法,这个方法的方法体就是Lambda表达式中的代码
      • image-20230113102826092
    • 还会形成一个匿名内部类,实现接口,重写抽象方法
    • 在接口的重写方法中会调用新生成的方法
      • image-20230113103632313
  • 理解:Lambda表达式就是对抽象方法的重写

Lambda省略格式

// 省略前
(int a) -> {
    return new Person();
}
// 省略后
a -> new Person()
  • 小括号内参数的类型可以省略
  • 小括号内有且仅有一个参数,小括号可以省略
  • 大括号内有且仅有一个语句,可以同时省略大括号、return关键字及分号

Lambda的前提条件

  • 方法的参数或局部变量的类型必须为接口才能使用Lambda
  • 接口中有且只有一个抽象方法
    • 只有一个抽象方法的接口称为函数式接口,我们就能使用Lambda
    • @FunctionalInterface:检测这个接口是否只有一个抽象方法
      • image-20230113111630307

Lambda和匿名内部类对比

  • 所需的类型不一样
    • 匿名内部类:需要的类型可以是类、抽象类、接口
    • Lambda:需要的类型必须是接口
  • 抽象方法的数量不一样
    • 匿名内部类:数量随意
    • Lambda:只能有一个
  • 实现原理不同
    • 匿名内部类:编译后形成class文件
    • Lambda:运行时动态生成class

JDK8接口新增的两个方法

  • JDK8以前

    • interface 接口名 {
          静态常量;
          抽象方法;
      }
      
  • JDK8对接口的增强,接口还可以有默认方法静态方法

  • JDK8

    • interface 接口名 {
          静态常量;
          抽象方法;
          默认方法;
          静态方法;
      }
      
  • 默认方法

    • image-20230113145429943

      • 因此JDK8时为接口新增了默认方法
      • 接口中的默认方法实现类不必重写,可以直接使用,实现类也可以根据需要重写
    • 默认方法的定义格式

      • interface 接口名 {
            修饰符 default 返回值类型 方法名() {
                //...
            }
        }
        
    • 默认方法的使用

      • 实现类直接调用接口默认方法
      • 实现类重写接口默认方法
  • 静态方法

    • 为了方便接口扩展,JDK8为接口新增了静态方法

    • 静态方法的定义格式

      • interface 接口名 {
            修饰符 static 返回值类型 方法名() {
                //...
            }
        }
        
    • 静态方法的使用

      • 接口静态方法实现类不会继承、不能重写?
      • 使用:接口名.静态方法名()
  • 区别

    • 默认方法通过实例调用,静态方法通过接口名调用
    • 默认方法可以被继承,实现类可以直接使用接口默认方法,也可以重写接口默认方法
    • 静态方法不能被继承,实现类不能重写接口静态方法,只能通过接口名调用

常用内置函数式接口

  • 在 java.util.function包中

  • Supplier接口

    • public interface Supplier<T> {
      	T get();
      }
      
  • Consumer接口

    • public interface Consumer<T> {
          void accept(T t);
      }
      
  • Function接口

    • public interface Function<T, R> {
          R apply(T t);
      }
      
  • Predicate接口

    • public interface Predicate<T> {
          boolean test(T t);
      }
      

方法引用格式

  • 符号表示: ::
  • 符号说明:双冒号为方法引用运算符,而它所在表达式被称为方法引用
  • 应用场景:如果Lambda所要实现的方案,已经有其他方法存在相同方案,那么则可以使用方法引用

对象名::引用成员方法

image-20230117144952979

  • 注意事项
    • 被引用的方法,参数要和接口中抽象方法的参数一样
    • 当接口的抽象方法有返回值时,被引用的方法也必须有返回值

类名::引用静态方法

image-20230117150737718

类名::引用实例方法

image-20230117151817403

  • 注意:
    • 实际上会将第一个参数作为方法的调用者
    • 类名:: 中的类名为第一个参数的类

类名::new引用构造器

image-20230124235145403

数组::new 引用数组构造器

image-20230124235719176

标签:静态方法,接口,学习,匿名,默认,笔记,方法,Java8,Lambda
From: https://www.cnblogs.com/gzblog/p/17071685.html

相关文章

  • CAD入门学习技巧:CAD怎么改变线条颜色?
    在电脑或手机中查看编辑CAD图纸时,为了方便区分不同的图形和文字,会将同类图形对象设置为相同颜色,不同类的图形设置为不同的颜色,以示区分。那么,CAD怎么改变线条颜色呢?本文就......
  • 分块学习笔记
    分块优雅的暴力。分块的思想是通过划分和预处理来达到时间复杂度的平衡。分块后任取一区间,中间会包含整块和零散块。一般对零散块暴力处理,整块通过预处理的信息计算。......
  • 【Matlab学习1.5】矩阵元素的引用
    矩阵元素的引用方式矩阵元素的引用下标必须为正数,且用圆括号括起来A(3,2)表示A矩阵第3行第2列的元素,如:>>A(3,2)=200例1.5.1:>>A=[1,2,3;4,5,6];>>A(4,5)=10......
  • Jmeter学习:监听器--结果树监听器/报告总结/汇总报告/汇总结果/响应时间监听器/简单数
    一、结果树监听器功能:利用该组件,我们可以查看采样器的请求参数、返回结果。使用场景:一般在调试测试计划期间用来查看采样器结果,负载期间使用会消耗大量资源,慎用。 ......
  • JavaScript学习笔记—DOM简介
    DOM(DocumentObjectModel)文档对象模型使用JS去操作网页的一组对象DOM属于WebAPI的一部分。WebAPI中定义了非常多的对象,通过这些对象可以完成对网页的各种操作(添加删......
  • 【Matlab学习1.4】矩阵的表示
    矩阵是Matlab中最基本的数据对象,Matlab大部分运算或命令都是在矩阵的意义下执行的。矩阵的建立直接输入法将矩阵的元素用中括号括起来,按矩阵行的顺序输入各元素,同一行的......
  • JavaSE学习笔记Day 1
     packagecom.baidu.demo;/***@authorbaozi*@version1.0*@since1.8*/publicclassDemo01{Stringname;/****@paramname*@return......
  • 【Python基础学习】7.文件和数据格式化
    主要参考来源:慕课嵩天老师的“Python语言程序设计”[https://www.icourse163.org/course/BIT-268001?tid=1468130447]格式化包括字符串格式化和数据格式化字符串格式化:......
  • 数论笔记5-同余理论
    温馨提示:这一篇的性质非常多(不过很多性质都比较简单)1.同余若\(m|a-b\),称\(a,b\)模\(m\)同余,\(b\)是\(a\)对模\(m\)的剩余,记作\(a\equivb\pmodm......
  • JavaScript学习笔记—垃圾回收
    垃圾回收(Garbagecollection)如果一个对象没有任何的变量对其进行引用,那么这个对象就是一个垃圾垃圾对象的存在,会严重的影响程序的性能在JS中有自动的垃圾回收机制,这些......