从匿名内部类到Lambda表达式:Java编程的优雅进化

embedded/2024/10/20 5:46:14/

匿名内部类

首先我们先来介绍一下什么是匿名内部类

匿名内部类:java中一种特殊的类定义方式,它允许你在需要实现一个接口或继承一个类的地方直接定义一个该接口或类的匿名子类。若想创建一个派生类的对象,并且对象只创建一次,可以设计为匿名内部类,可以大 大简化代码

注意:匿名内部类中不能修改外面局部变量的值

问:内部类有独立的.class吗?

答:有

让我们一起看看代码实例 

package ooday04;public class AnonInnerClassDemo {public static void main(String[] args) {//1)创建了Inter的一个派生类,但是没有名字//2)为该派生类创建了一个对象,名为o1,向上造型为Inter类型//  ----new Inter(){};是在创建Inter的派生类的对象//3)大括号中的为派生类的类体Inter o1 = new Inter(){};//1)创建了Inter的一个派生类,但是没有名字//2)为该派生类创建了一个对象,名为o2,向上造型为Inter类型//3)大括号中的为派生类的类体Inter o2 = new Inter(){};int num = 5;num = 6;//1)创建了InterInter的一个派生类,但是没有名字//2)为该派生类创建了一个对象,名为o3,向上造型为InterInter类型//3)大括号中的为派生类的类体InterInter o3 = new InterInter(){public void show(){System.out.println("showshow");//num = 55; //编译错误,匿名内部类中不能修改外面局部变量的值//因为该变量在此处会默认为final的}};o3.show();}}interface InterInter{void show();}interface Inter{}

 让我们再一起看看具体的实践

        List<String> list1 = new ArrayList<>();list1.add("你好啊");list1.add("哇你好( •̀ ω •́ )");list1.add("你好");Collections.sort(list1, new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o1.length() - o2.length();}});System.out.println(list1);

那么是不是感觉还是就算简化了类的创建还是很麻烦,不够清晰明了,这就可以介绍今天的主角了Lambda表达式了

Lambda表达式 

Lambda表达式是Java 8及更高版本中引入的一个特性,它提供了一种简洁的方式来表示匿名方法。Lambda表达式允许你以更直观、更简洁的方式编写代码,特别是在处理集合、事件监听或任何需要传递函数作为参数的场景中。

语法规则

Lambda表达式的基本语法由三部分组成:参数列表、箭头(->)和Lambda体(即方法体)。

(参数列表)->{
 方法体
 }

代码实例 

在了解基本语法后我们来看看具体的实现 接下来是匿名内部类写法和lambda表达式写法的对比

        //自定义比较器的匿名内部类写法Comparator<String> c1 = new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o2.length() - o1.length();}};
        //使用lambda表达式//lambda表达式就是省去了匿名内部类创建是接口与方法名部分Comparator<String> c2 = (String o1, String o2) -> {return o2.length() - o1.length();};

是不是简洁了许多,但是别急还能更加的简洁

        //lambda表达式可以忽略参数的类型//如果方法中只有一句代码时,该方法体的“{}”可以忽略不写//如果这句代码含有return关键字时,也要一起忽略returnComparator<String> c3 = (String o1, String o2) -> o2.length() - o1.length();

 接下来再介绍一个基于lambda表达式遍历集合元素

forEach 

JDK8之后,java在集合Collection接口中添加了一个用于遍历集合元素的forEach

        Collection<String> c = new ArrayList<>();c.add("one");c.add("two");c.add("three");c.add("four");for (String e : c) {System.out.println(e);}//tips:当lambda中只有一个参数时,参数列表的"()"可以忽略不写c.forEach(e->System.out.println(e));/*JDK8中出现的lambda表达式的变种写法:方法引用对象::方法当lambda表达式的参数与方法体中调用方法的参数一致时例如:(e)->System.out.println(e);那么就可以写作:System.out::println;对象::方法现在以了解为主即可*/c.forEach(System.out::println);
 

 

 

 

 

 

 


http://www.ppmy.cn/embedded/100384.html

相关文章

【C#】【EXCEL】Bumblebee/Classes/ExEnums.cs

文章目录 Bumblebee/Classes/ExEnums.csFlow diagramDescriptionCode Bumblebee/Classes/ExEnums.cs Flow diagram #mermaid-svg-FB98N7ZCCccQ4Z38 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FB98N7ZCCccQ4Z38…

【论文阅读】Retargeting and Respecializing GPU Workloads for Performance Portability

摘要 为了接近峰值性能&#xff0c;像gpu这样的加速设备需要大量的特定于架构的调优&#xff0c;以了解共享内存、并行性、tensor core等的可用性。不幸的是&#xff0c;对更高性能和更低成本的追求导致了架构设计的显著多样化&#xff0c;甚至是产自同一供应商的产品也是如此。…

【Linux多线程】线程安全的单例模式

文章目录 1. 单例模式 与 设计模式1.1 单例模式1.2 设计模式1.3 饿汉实现模式 与 懒汉实现模式1.4 饿汉模式① 饿汉模式的特点② 饿汉式单例模式的实现③ 饿汉式单例模式的优缺点④ 适用场景 1.5 懒汉模式① 懒汉式单例模式的特点② 懒汉式单例模式的实现③ 懒汉式单例模式的优…

记录一次搭建uniapp-vue3的基础项目

1.使用 HBuilder X 创建uniapp vue3的基础项目 2.安装 自动导包插件 unplugin-auto-import npm install unplugin-auto-import或者 pnpm install unplugin-auto-import2.1 根目录下创建 vite.config.js 复制粘贴以下内容 import { defineConfig } from vite import uni fro…

【HarmonyOS 4.0】全局UI方法

1. 弹窗 1.1 Toast - 消息提示 常用于显示一些简短的消息或提示&#xff0c;一般会在短暂停留后自动消失。 import promptAction from ohos.promptActionpromptAction.showToast(options: {message: string | Resource, duration: number, bottom: string | number}): void1.2…

第2章-05-接口API与安全签名算法

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站百大博主。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于专栏:Web爬虫入门与实战精讲,后续完整更新内容如下。 文章…

查找------折半查找(二分查找)

目录 折半查找算法原理 折半查找的步骤 折半查找的时间复杂度 折半查找的空间复杂度 例题演示&#xff1a; 题目描述 具体代码&#xff1a; 折半查找算法原理 折半查找&#xff08;也称为二分查找&#xff09;是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将…

Vue解决父子组件传值,子组件改变值后父组件的值也改变的问题

vue开发过程中&#xff0c;父组件通过props传值给子组件&#xff0c;子组件在页面展示父组件的值&#xff0c;在操作子组件值以后&#xff0c;即使不点击确定按钮&#xff0c;父组件中的值也发生了变化&#xff0c;但是需求是操作子组件数据以后&#xff0c;必须点击"确定…