当前位置: 首页 > news >正文

java —— 匿名内部类与 Lambda 表达式

一、匿名内部类

匿名内部类是一种没有名称的类,多用于只使用一次的情况,本质上就是其所继承的父类或接口的一个子类。

(一)继承普通类的情况

public class Test{public void method(){System.out.println("通用方法");}public static void main(String[] args){Test ts1=new Test();ts1.method();           //调用普通方法
//创建内部类,等价于Test的一个子类,同时将其实例化为ts2Test ts2=new Test(){public void method(){System.out.println("内部类方法");}};ts2.method();          //调用内部类方法}
}

(二)继承抽象类的情况

public abstract class Test{public abstract void method(String a);
}
public class TT{public static void main(String[] args){Test ts=new Test(){public void method(String a){System.out.println(a);}};ts.method();}
}

 本案例中,ts 本质上就是抽象类 Test 的一个子类的实例化对象,在匿名内部类中对抽象类 Test 中的 method 方法进行重写,然后调用。

(三)继承接口的情况

public interface Test{public void method(int a,int b);
}
public class TT{public static void main(String[] args){Test ts=new Test(){public void method(int a,int b){System.out.println(a+b);}};ts.method();}
}

 继承接口的情况与继承抽象类的情况类似,ts 仍然相当于接口 Test 的一个子类的实例化对象,重写方法后,用这个子类的实例化对象 ts 去调用这个子类的方法 method。

二、Lambda表达式

在很多情况下,匿名内部类的书写过于繁琐,此时可以用 Lambda 表达式代替,其语法格式为:()->{}。对应上述三种情况,代码更改如下:

(一)继承普通类的情况

public class Test{public void method(){System.out.println("通用方法");}public static void main(String[] args){Test ts1=new Test();ts1.method();           //调用普通方法
//创建内部类,等价于Test的一个子类,同时将其实例化为ts2Test ts2=()->{System.out.println("内部类方法");};ts2.method();          //调用内部类方法}
}

(二)继承抽象类的情况

public abstract class Test{public abstract void method(String a);
}
public class TT{public static void main(String[] args){Test ts=(String a)->{System.out.println(a);};ts.method();}
}

(三)继承接口的情况

public interface Test{public void method(int a,int b);
}
public class TT{public static void main(String[] args){Test ts=(int a,int b)->{System.out.println(a+b);};ts.method();}
}

三、精简 Lambda 表达式

① 参数类型可以省略

② 如果只有一个参数,() 可以省略

③ 如果方法体只有一条语句,{} 可以省略

④ 如果方法体中唯一的一条语句是 return 语句,省略 {} 的同时,return 关键字也要省略

对应上述三种情况,代码可进一步优化为:

Test ts2=()->System.out.println("内部类方法");
 Test ts=a->System.out.println(a);
Test ts=(a,b)->System.out.println(a+b);

相关文章:

  • python-最接近target的值
  • R语言绘图 --- 柱状图(Biorplot 开发日志 --- 3)
  • Tree——输出项目的文件结构(Linux)
  • 多项目的.net core解决方案(项目间引用)如何使用Docker部署
  • keepalived安装文档
  • Python知识点11---高阶函数
  • 冒泡排序与快速排序
  • C#中的值类型与引用类型
  • 计算机毕业设计 | SpringBoot+vue仓库管理系统(附源码)
  • 欧科云链:Web3.0时代 具备链上数据分析能力的公司愈发凸显其价值
  • JCR一区级 | Matlab实现TCN-BiGRU-MATT时间卷积双向门控循环单元多特征分类预测
  • 解释Python中的PEP 8是什么 为什么它很重要
  • 基于Chisel的FPGA流水灯设计
  • ios:文本框默认的copy、past改成中文复制粘贴
  • 平移数据c++
  • 2019.2.20 c++ 知识梳理
  • CODING 缺陷管理功能正式开始公测
  • ES6系列(二)变量的解构赋值
  • input的行数自动增减
  • java中具有继承关系的类及其对象初始化顺序
  • Material Design
  • Octave 入门
  • SegmentFault 2015 Top Rank
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 模型微调
  • 强力优化Rancher k8s中国区的使用体验
  • 如何设计一个比特币钱包服务
  • 突破自己的技术思维
  • 携程小程序初体验
  • 一道面试题引发的“血案”
  • 异常机制详解
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • #14vue3生成表单并跳转到外部地址的方式
  • #etcd#安装时出错
  • #laravel 通过手动安装依赖PHPExcel#
  • #每天一道面试题# 什么是MySQL的回表查询
  • $.proxy和$.extend
  • (02)Unity使用在线AI大模型(调用Python)
  • (3)(3.5) 遥测无线电区域条例
  • (4) PIVOT 和 UPIVOT 的使用
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (十五)、把自己的镜像推送到 DockerHub
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • ***检测工具之RKHunter AIDE
  • .net 生成二级域名
  • .net访问oracle数据库性能问题
  • .Net转前端开发-启航篇,如何定制博客园主题
  • /usr/bin/env: node: No such file or directory
  • @RequestMapping处理请求异常
  • [ IO.File ] FileSystemWatcher
  • [ linux ] linux 命令英文全称及解释