主题1:背景及简介

Posted zyj-468161691

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了主题1:背景及简介相关的知识,希望对你有一定的参考价值。

背景:

    java是面向对象的编程语言,使用类中的方法来封装“行为”;java的对象往往比较“重量级”,实例化一个类型通常会涉及到一定数量的其他类型,并需要初始化字段。

不过有些 Java 对象只是对单个函数的封装。例如Java Swing库中定义的接口ActionListener(一种回调接口):

public interface ActionListener {
   void actionPerformed(ActionEvent e);
}

匿名类:

因为有些行为只在某个地方需要,这样通常不会为其单独定义一个类型,而是使用匿名类把行为内联(inlne):

button.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
     ui.dazzle(e.getModifiers());
   }
});

优势:

  在很多并发编程中,会大量使用匿名类,这样不同的线程都可以独占资源,避免抢占资源

  可以减少需要管理的类的数量

缺陷:

    随着回调模式和函数式编程风格的日益流行,我们需要在Java中提供一种尽可能轻量级的将代码封装为数据(Model code as data)的方法。匿名内部类并不是一个好的 选择,因为:

(1)语法过于冗余

(2)匿名类中的 this 和变量名容易使人产生误解

(3)类型载入和实例创建语义不够灵活

(4)内部类中无法引用非 final 的外部变量

(5)无法对控制流进行抽象

Java8的改进:

  • 通过提供更简洁的语法和局部作用域规则,Java SE 8 彻底解决了 (1) 和 (2)
  • 通过提供更加灵活而且便于优化的表达式语义,Java SE 8 绕开了(3)
  • 通过允许编译器推断变量的“常量性”(finality),Java SE 8 减轻了(4) 带来的困扰

函数式接口:

    在java中也叫抽象方法类型SAM(Single Abstract Method)。是指只定义了一个有效方法的interface,这里所说的有效,是指:不是重复定义Object或父接口的方法

JDK编译器可以根据interface的接口自动判断接口是否是函数式接口,开发人员也可以使用注解@FunctionalInterface 显示定义一个函数接口。

优点:

  • 接口是 Java 类型系统的一部分
  • 接口天然就拥有其运行时表示(Runtime representation)
  • 接口可以通过 Javadoc 注释来表达一些非正式的协定(contract),例如,通过注释说明该操作应可交换(commutative)

lambda表达式:

  匿名类的语法比较冗余,大量的代码中可能只有几行有用。而lambda表达式也是匿名的,但是它轻量,极度简化。

给出几个lambda示例:

(int x, int y) -> x + y

定义一个“功能”,接收2个int类型参数,返回参数之和

() -> 42

定义一个功能,返回42

(String s) -> { System.out.println(s); }

定义一个功能,接收String类型参数,并输出控制台,没有返回信息

 

lambda表达式返回一个函数式接口的实现实例——匿名类实例对象

以上是关于主题1:背景及简介的主要内容,如果未能解决你的问题,请参考以下文章

直播TTIC Ph.D:PyTorch简介 | 学术青年分享会

tomcat简介及原理解说

LAD线性判别模型简介及sklearn参数

Redis数据库的简介部署及常用命令

01惯性导航-简介及惯性传感器

前端开发工程师 - 06.Mini项目实战 - 项目简介