主题1:背景及简介
Posted zyj-468161691
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了主题1:背景及简介相关的知识,希望对你有一定的参考价值。
背景:
java是面向对象的编程语言,使用类中的方法来封装“行为”;java的对象往往比较“重量级”,实例化一个类型通常会涉及到一定数量的其他类型,并需要初始化字段。
不过有些 Java 对象只是对单个函数的封装。例如Java Swing库中定义的接口ActionListener(一种回调接口):
public interface ActionListener { |
因为有些行为只在某个地方需要,这样通常不会为其单独定义一个类型,而是使用匿名类把行为内联(inlne):
button.addActionListener(new ActionListener() { |
优势:
在很多并发编程中,会大量使用匿名类,这样不同的线程都可以独占资源,避免抢占资源。
可以减少需要管理的类的数量
缺陷:
随着回调模式和函数式编程风格的日益流行,我们需要在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:背景及简介的主要内容,如果未能解决你的问题,请参考以下文章