Lambda表达式与匿名内部类
匿名内部类
匿名内部类适合创建那种只需要一次使用的类,匿名内部类的语法有点奇怪,创建匿名内部类时会立即创建一个该类的实例,这个类定义立刻消失,匿名内部类不能重复使用(一次性的)
- 定义匿名内部类的格式如下:
new 实现接口() | 父类构造器(实参列表){//匿名内部类的类体部分}
- 匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类,或实现一个接口
- 匿名内部类有如下规则:
匿名内部类不能是抽象类,因为系统在创建匿名内部类时,会立即创建匿名内部类的对象。因此不允许将匿名内部类定义成抽象类。
匿名内部类不能定义构造器。由于匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以定义初始化块,可以通过实例初始化块来完成构造器需要完成的事情。
通过实现接口来创建匿名内部类时,匿名内部类也不能显示创建构造器,因此匿名内部类只有一个隐式的无参构造器,故 new 接口名后的括号里不能传入参数值。(无参构造)
通过继承父类来创建匿名内部类时,匿名内部类将拥有和父类相似的构造器,此处的相似指拥有相同的形参列表。
创建匿名内部类时,必须实现接口或抽象父类里的所有抽象方法。
下面对应解释说明:
因为抽象类有构造器但不能直接实例化(因为有抽象方法);上列已经得知创建内部类时会立即创建内部类对象。抽象类是不能实例的,只能作为父类被继承,由子类实现抽象类里的抽象方法。
匿名内部类不能定义构造器,这个好理解,因为构造器就是一个没有返回值,方法名和类一样的构造方法而已,类都是匿名的你怎么定义构造器呢?
实现接口创建匿名内部类时,匿名内部类不能显示创建构造器;我们先回顾下接口,接口里不能包含构造器和初始化块因为 接口里成员变量只能是静态常量,接口里的方法只能是抽象方法、类方法、默认方法
继承父类来创建匿名内部类,匿名内部类将拥有和父类相似的构造器,这个没什么解释,知道就可以它的规则就是这样。
匿名内部类也是类,也需要遵守继承类/抽象类 或 实现接口的规则。
- 最后我们来分析一下这个 定义匿名内部类的格式:
new 实现接口() | 父类构造器(实参列表){//匿名内部类的类体部分}
通过实现接口来创建匿名内部类
new 实现接口 (){ }
会得到一个实现此接口的类的实例/对象
例如 :new A() { }
会得到一个实现了A接口的类的实例
(A此例中代表接口)通过继承父类来创建匿名内部类
new 父类构造器(实参列表){ }
会得到一个继承了该类的子类实例 / 对象
例如 :new B() { }
会得到一个继承了B类的子类实例
(B此例中代表父类)
Lambda表达式
这是Java 8 的重要更新,Lambda表达式支持将代码块作为方法参数,Lambda 表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例。
Lambda表达式可以简化匿名内部类对象,不需要new Xxx(){}这种繁琐的代码,不需要指出重写的方法名字,也不需要给出重写的方法的返回值类型-----只要给出重写的方法括号以及括号里的形参列表即可。
使用Lambda表达式代替匿名内部类创建对象时,Lambda表达式的代码块会代替实现抽象方法的方法体,Lambda表达式就相当一个匿名方法。
Lambda由3部分组成
- 形参列表。允许省略形参类型,如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。
- 箭头(->)
- 代码块。如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号,那么这条语句就不要用花括号表示语句结束。Lambda代码块只有一条return语句,甚至可以省略return关键字,Lambda表达式需要返回值,而他的代码块中仅有一条省略了return的语句,Lambda表达式会自动返回这条语句的值。
说了这么多,先来个实例吧!
interface It{ //函数式接口(只有一个抽象方法)void hi(String s); //此接口只有个抽象方法hi(String s)
}
- 使用Lambda表达式创建一个 It 对象(实际类型是lt接口实现类的实例,自动向上转型了)
It t = s->System.out.println(s);t.hi("大家好!");//输出 大家好!
- 上列利用了lambda表达式实现了如上匿名内部类一样的效果,
- 最后说明下:,同样的 Lambda 表达式的目标类型完全可能是变化的 -----唯一的要求是,Lambda 表达式实现的匿名方法与目标类型 (函数式接口)中唯一的抽象方法有相同的形参列表。
最后介绍下方法引用与构造器引用
如果 Lambda 表达式的代码块只有一条代码,程序就可以省略 Lambda 表达式中代码的花括号{}.不仅如此,如果 Lambda 表达式的代码块只有一条代码,还可以在代码块中使用方法引用和构造器引用。
方法引用和构造器引用可以让 Lambda 表达式的代码更简洁。方法引用和构造器引用都需要使用 两个英文冒号。Lambda 表达式支持如下表几种引用方式。
种类 | 示例 | 对应的 Lambda表达式 |
---|---|---|
引用类方法 | 类名::类方法 | (a,b…)->类名.类方法(a,b…) |
引用特定对象的实例方法 | 特定对象::实例方法 | (a,b…)->特定对象.实例方法(a,b…) |
引用某类对象的实例方法 | 类名::实例方法 | (a,b…)->a.实例方法(b…) |
引用构造器 | 类名::new | (a,b…)->类名(a,b…) |
- 对应的说明参考下列:
- 函数式接口中被实现的全部参数传给该类方法作为参数
- 函数式接口中被实现的全部参数传给该类方法作为参数
- 函数式接口中被实现方法的第一个参数作为调用者,后面的参数全部传给该方法作为参数
- 函数式接口中被实现的全部参数传给该类方法作为参数
- 赶着写作业了,就借助上面例子来个示例:
interface It{ //函数式接口(只有一个抽象方法)void hi(String s); //此接口只有个抽象方法hi(String s)
}
- 使用Lambda表达式创建一个 It 对象(实际类型是lt接口实现类的实例,自动向上转型了)
It t = s->System.out.println(s);t.hi("大家好!");//输出 大家好!
- 引用特定对象的实例方法
It t = System.out::println;t.hi("大家好!");//输出 大家好!
先溜了,如有哪里需要补充请留言,多实践!
Lambda表达式与匿名内部类相关推荐
- 1.24 Lambda表达式与匿名内部类的联系和区别
Java Lambda 表达式的一个重要用法是简化某些匿名内部类的写法,因此它可以部分取代匿名内部类的作用. Lambda 表达式与匿名内部类的相同点如下: Lambda 表达式与匿名内部类一样,都可 ...
- Lambda01 编程范式、lambda表达式与匿名内部类、函数式接口、lambda表达式的写法...
1 编程范式 主要的编程范式有三种:命令式编程,声明式编程和函数式编程. 1.1 命令式编程 关注计算机执行的步骤,就是告诉计算机先做什么后做什么 1.2 声明式编程 表达程序的执行逻辑,就是告诉计算 ...
- 关于JDK lambda表达式与匿名内部类的等价实现却出现了截然不同的结果原因分析
发现了一个很奇怪的现象,先上代码: public interface A {int f();default A cf(A other){return new A(){@Overridepublic i ...
- Lambda表达式和匿名内部类的区别【理解】
所需类型不同 匿名内部类:可以是接口,也可以是抽象类,还可以是具体类 Lambda表达式:只能是接口 使用限制不同 如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类 如 ...
- [Java基础]Lambda表达式和匿名内部类的区别
- 匿名内部类与Lambda表达式
匿名内部类与Lambda表达式 一.匿名内部类 谁没有名字:匿名内部类指的是接口的实现类 或者 抽象类的子类没有名字. 1.前提: 1)必须要有一个接口.抽象类(普通类也可以,但是方法不会强制重写,不 ...
- Lambda 表达式详解~简化匿名内部类
本节将介绍如何使用Lambda表达式简化匿名内部类的书写,但Lambda表达式并不能取代所有的匿名内部类,只能用来取代函数接口(Functional Interface)的简写.先别在乎细节,看几个例 ...
- 工具技巧和读文档 | 读函数式编程接口文档 | 匿名内部类 | lambda表达式 |IDEA
Function接口,函数式接口 按入参返回值分类,大概分为4种类型,再加上多个入参就又多了Bi开头的两种. 有Ctrl+P的时候不懂参数列表该写啥,就先Ctrl+ALT看下入参类型的相关实现类! 一 ...
- jdk8新特性 lambda表达式详解
本文主要讲到的内容有: 一- 前言 二- 背景 三- lambda表达式的语法 四- Lambda程序例子 4-1 Runnable Lambda 4-2 Comparator Lambda 4-3 ...
最新文章
- POJ 1678 I Love this Game!
- python自学网站有哪些-分享干货:三个新手自学Python的网站!
- 中国石材胶市场需求现状调研与前景预测分析报告2022版
- 行业研究报告基本分析思路
- Ucenter会员同步通讯登录原理(转)
- python os.walk
- hdu 2111 Saving HDU (DP)
- 嵌入式OS入门笔记-以RTX为案例:三.初探进程
- VMware NAT模式设置静态IP(可上网)
- listview拖动优化问题
- python 读取并显示图片,用plt 同时显示多幅图像
- R语言中最强的神经网络包RSNNS
- jquery多字段筛选,极简方法
- 遭遇爆炸式匿名*** 瑞星称有人下黑手
- VC++ 窗口拆分CSplitterWnd
- 利用STM32F103精确控制步进电机
- Xcelsius 2008和Crystal Xcelsius Professional 4.5截图对比
- 花生壳 linux客户端 命令
- Snort - manual 笔记(二)
- 拦截器、过滤器、监听器