匿名内部类

匿名内部类主要是针对继承(类继承、抽象类继承、接口实现)这一概念而形成的一种简化定义,首先我们来观察如下一段代码。

范例:观察传统实现方式的问题

interface IMessage {public void send(String msg);
}
class MessageImpl implements IMessage{public void send(String msg){System.out.println(msg);}
}
class TestDemo{public static void main(String[] args) {IMessage msg = new MessageImpl();msg.send("www.mldn.cn");}
}// 执行结果: www.mldn.cn

如果现在定义的 MessageImpl 子类只使用唯一的一次,那么是否还有必要将其定义为一个单独的类呢,这样就可以利用匿名内部类的形式来简化当前的类定义。

范例:匿名内部类

interface IMessage {public void send(String msg);
}
class TestDemo{public static void main(String[] args) {IMessage msg = new IMessage() {@Overridepublic void send(String msg) {System.out.println(msg);}};msg.send("www.mldn.cn");}
}// 执行结果: www.mldn.cn

使用匿名内部类可以针对于只在一个地方上使用的接口或者抽象类的子类进行简单的定义,从而减少项目中 *.java 文件的出现,但是依然会有 *.class 文件出现。

Lambda表达式

Lambda表达式的背景:解决匿名内部类代码过于冗余的问题,另外为了方便Lambda表达式的使用,Java从JDK 1.8 开始内方法中的内部类可以在不加final的情况下直接访问方法的参数。

Lambda是一种函数式编程(最早的函数式编程“haskell”),Java 从 JDK1.8 开始引入之后,整体的开发结构上就发生了改变。

传统的匿名内部类中最核心的部分只有一行语句”System.out.println(msg);“,但是由于Java之中的面向对象结构的严苛要求,所以不得不编写许多与之辅助的,并且和实际开发完全没有关系的结构。

范例:使用Lambda解决当前的问题

interface IMessage {public void send(String msg);
}
class TestDemo{public static void main(String[] args) {IMessage msg =(str)->{System.out.println(str);};msg.send("www.mldn.cn");}
}
// 执行结果:www.mldn.cn

与匿名内部类相比,使用Lambda表达式代码整体会简洁许多,在 Java 中使用Lambda表达式基本上采用的语法如下:

编写多行语句:

(参数,参数,...) -> {

方法体;

}

编写单行返回语句: (参数,参数,...) -> 计算表达式;

在使用函数式编程的时候有一个重要的前提:一个接口只允许出现有一个抽象方法,如果接口中要想有其他的方法,只能够是static方法或者是default方法,于是为了防止有一下开发者在使用Lambda表达式的接口上定义更多的抽象方法,所以Java提供有一个新的注解“ @FunctionalInterface”(函数式接口)。

使用Lambda操作目的是改善匿名内部类的使用,同时使用简化的语法形式进行方法覆写的实现。

如果对于一个函数式接口中的方法功能非常简单,只是进行简单的表达式计算并且返回结果,那么可以单行编写。

范例:编写简单的函数式接口

@FunctionalInterface
interface IMath{public int add(int a,int b);
}
public class test {public static void main(String[] args) {IMath ma=(a,b)->a+b;System.out.println(ma.add(10,30));  }
}
//执行结果:40

Lambda 从诞生开始就替代匿名内部类的实现,但是也要求有接口的支持。

匿名内部类和Lambda表达式相关推荐

  1. 匿名内部类与Lambda表达式习题

    匿名内部类与Lambda表达式习题 1.写一个函数式接口 public Operation{ public int calc(int a,int b); } 在测试类中写一个method方法,参数为O ...

  2. 匿名内部类与Lambda表达式

    匿名内部类与Lambda表达式 一.匿名内部类 谁没有名字:匿名内部类指的是接口的实现类 或者 抽象类的子类没有名字. 1.前提: 1)必须要有一个接口.抽象类(普通类也可以,但是方法不会强制重写,不 ...

  3. Java匿名内部类和Lambda表达式

    Java匿名内部类和Lambda表达式 一.Java匿名内部类 二.JavaLambda表达式 全部代码: 代码运行结果: 一.Java匿名内部类 我们在使用匿名内部类时,需要记住以下几个重要的知识点 ...

  4. java 匿名函数 构造_Java匿名内部类与Lambda表达式

    匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 实例1:不使用匿名内部类来实现抽象 ...

  5. Java基础学习总结(69)——匿名内部类与Lambda表达式

    前言 Java Labmda表达式的一个重要用法是简化某些匿名内部类(Anonymous Classes)的写法.实际上Lambda表达式并不仅仅是匿名内部类的语法糖,JVM内部是通过invokedy ...

  6. 【Android-Kotlin】匿名内部类与Lambda 表达式(附RecycleView监听)

    一:匿名内部类 一个Test类,里面 1)1个属性 2)1个方法 a.该方法传递的参数是一个接口对象,目的是在这个方法中可以通过这个对象来调用接口方法 接口对象的接口TestInterFace内部有一 ...

  7. 匿名内部类以及Lambda表达式(Java和C#)

    就来说一说这个匿名内部类,用Java做例子,后面插一点c#.这个东西我之前也知道了很久,一直没有认真去看过,这次就来看看吧,今天的代码量相对很多. 匿名内部类 这里就说匿名内部类,关于其他内部类老规矩 ...

  8. 工具技巧和读文档 | 读函数式编程接口文档 | 匿名内部类 | lambda表达式 |IDEA

    Function接口,函数式接口 按入参返回值分类,大概分为4种类型,再加上多个入参就又多了Bi开头的两种. 有Ctrl+P的时候不懂参数列表该写啥,就先Ctrl+ALT看下入参类型的相关实现类! 一 ...

  9. java8 lambda 表达式详解

    lambada 表达式实质上是一个匿名方法,但该方法并非独立执行,而是用于实现由函数式接口定义的唯一抽象方法 使用 lambda 表达式时,会创建实现了函数式接口的一个匿名类实例 可以将 lambda ...

最新文章

  1. Rclone使用笔记
  2. java远程线程注入_系统权限远程线程注入到Explorer.exe
  3. php sina ip api,新浪调ip地址api
  4. CentOS下用yum命令安装jdk
  5. Python 基础语法(二)
  6. WEBGL学习【八】模型视图投影矩阵
  7. (篇二)C语言动态分配内存、计算π的值
  8. RocketMQ源码分析之从官方示例窥探:RocketMQ事务消息实现基本思想
  9. java doget 返回json_HttpClient调用doGet、doPost、JSON传参及获得返回值
  10. python精确匹配字符串_Python: 字符串搜索和匹配,re.compile() 编译正则表达式字符串,然后使用match() , findall() 或者finditer() 等方法...
  11. 华为服务器2288h修改u盘启动,华为服务器bios设置u盘启动
  12. html5分辨率异常自动检测
  13. Java 导出excel进行换行
  14. 2.跟我走吧,现在就出发
  15. Vue3 的 ref 和 reactive 问题
  16. CGAL的安装与在VS中的配置
  17. ebs oracle xml publisher 不是有效责任,EBS excel模板xml publisher开发详解
  18. 新型多功能、高性能量子点,可以用于医学成像、量子计算
  19. 我个人整理的AD/2000技巧,各位收藏吧!60多个。 转贴
  20. java greenfoot_的Java Greenfoot中,不能将文件

热门文章

  1. “租个手机回家过年”,我后悔了
  2. 卖产品如何在抖音引流?如何利用抖音引流卖货?
  3. 一个简单的图书网店项目
  4. python3.7版本内置函数_python3.7内置函数整理笔记
  5. Pycharm中使用TabNine
  6. 如何将视频中的水印去掉,一键去除视频水印
  7. 用户自定义文件(word、excel)保存位置
  8. RK3399 CPU锁频
  9. java web之数据库的连接(使用JDBC连接sql server 2017)
  10. Java 引用kotlin class 提示 符号: 类 ** 程序包找不到