匿名函数的实现

1.定义一个函数式接口。只有一个抽象方法的接口就是函数式接口

//1.定义一个函数式接口。只有一个抽象方法的接口就是函数式接口
interface ILike {
void hit(long param);
}

没有类名,必须借助接口或父类

通过实例化函数式接口就可以完成匿名内部类实现此接口并重写方法

interface ILike {
void hit(long param);
} @Test
void testAnonymous() throws Exception { //匿名内部类,没有类名称,必须借助接口
ILike like = new ILike() {
@Override
public void hit(long param) {
System.out.println("i like anonymous => " + param);
}
}; for (int i = 0; i < 10; i++) {
like.hit(System.currentTimeMillis());
Thread.sleep(1000);
}
}

用 Lambda 简化匿名内部类的写法

匿名内部类是为了省去类名的写法

Lambda 简化写法不但可以省去类名,还可以省去接口名和函数名。因为只有一个抽象方法,可以直接实现并指向这个抽象方法和方法体

//1.定义一个函数式接口。只有一个抽象方法的接口就是函数式接口
interface ILike {
void hit(long param);
} @Test
void testLambda() throws Exception { // 用lambda简化,因为接口中只有一个函数,所以可以直接省略实例化的接口名和函数名
ILike like = (param) -> {
System.out.println("i like lambda => " + param);
}; for (int i = 0; i < 10; i++) {
like.hit(System.currentTimeMillis());
Thread.sleep(1000);
}
}
interface PrintInfo {
void print(String data);
} static void printJob(PrintInfo printInfo, String data) {
printInfo.print(data);
} @Test
void testLambda2() {
printJob(new PrintInfo() {
@Override
public void print(String statement) {
System.out.println("We're learning " + statement);
}
}, "Lambda");
}
interface PrintInfo {
void print(String data);
} static void printJob(PrintInfo printInfo, String data) {
printInfo.print(data);
} @Test
void testLambda2() {
printJob(statement -> System.out.println("We're learning " + statement), "Lambda");
}

结论

  • 匿名函数写法和匿名类写法的前提必须基于函数式接口
  • 匿名函数写法和匿名类写法其本质是同一个东西,只是简化写法不同
  • 使用Lambda表达式简写匿名函数时,可以同时省略实现类名、函数名。除此外也可以使用传统写法

源码:https://gitee.com/VipSoft/VipBoot/blob/develop/vipsoft-demo/src/test/java/com/vipsoft/demo/AnonymousFunction.java

Java 匿名函数的概念和写法的更多相关文章

  1. js中匿名函数的N种写法

    匿名函数没有实际名字,也没有指针,怎么执行? 关于匿名函数写法,很发散~ +号是让函数声明转换为函数表达式.汇总一下 最常见的用法: 代码如下: (function() {  alert('water ...

  2. js自调用匿名函数的三种写法

    第一种: (function(){ console.log(‘hello world”) })() 第二种: (function(){ console.log(‘hello world’) }()) ...

  3. C#中委托,匿名函数,lamda表达式复习

    一.委托 1.就给类比较,类用class声明,委托用delegate声明. 2.委托要指向一个真正的方法. 3.委托的签名,要和指向的方法一样. //1.声明一个委托 public delegate ...

  4. JS匿名函数理解

    匿名函数的基本形式为(function(){...})(); 前面的括号包含函数体,后面的括号就是给匿名函数传递参数并立即执行之 匿名函数的作用是避免全局变量的污染以及函数名的冲突   1.小括号的作 ...

  5. Python 中的匿名函数,你滥用了吗?

    概念 我们从一个例子引入. 这里有一个元素为非空字符串的列表,按字符串最后一个字母将列表进行排序.如果原列表是 ['abc', 'g', 'def'],则结果应该是 ['abc', 'def', 'g ...

  6. Python的程序结构[4] -> 函数/Function[2] -> 匿名函数

    匿名函数 / Anonymous Function 匿名函数是一种不需要绑定函数名的函数 (i.e. functions that are not bound to a name).匿名函数通过 la ...

  7. Java 终于在 Java 8 中引入了 Lambda 表达式。也称之为闭包或者匿名函数。

    本文首发于 blog.zhaochunqi.com 转载请注明 blog.zhaochunqi.com 根据JSR 335, Java 终于在 Java 8 中引入了 Lambda 表达式.也称之为闭 ...

  8. (转)Javascript匿名函数的写法、传参、递归

    (原)http://www.veryhuo.com/a/view/37529.html (转)javascript匿名函数的写法.传参和递归 javascript匿名函数的写法.传参和递归 http: ...

  9. (转)javascript匿名函数的写法、传参和递归

    (原)http://www.veryhuo.com/a/view/37529.html (转)javascript匿名函数的写法.传参和递归 http://www.veryhuo.com 2011-0 ...

  10. 关于js中立即执行的匿名函数写法

    /*最流行的写法*/ (function() { alert("run!") })(); /* !号可以有1~正无穷个,所以这一种就可以衍生无数种方式 */ !!!(functio ...

随机推荐

  1. Chromium gclient使用

    gclient 是由 Google 用 Python 开发的一套跨平台的git仓库管理工具,它的作用类似 git 的 submodule,用来将多个git仓库组成一个solution进行管理,比如ch ...

  2. .Net Core3中微信退款证书本地调试正常读取证书,在服务器IIS中加载不到证书文件

    如图,在开发微信退款功能时,需要用到微信提供的证书文件.本地开发调试时是正常的,但放到服务器(WinServer 2012 R2)中,则报错提示找不到文件. 网上找了一堆骚操作都没什么卵用,最后在其中 ...

  3. 数据结构与算法 | 动态规划算法(Dynamic Programming)

    上一篇文末已经提到了记忆化搜索是动态规划(Dynamic Programming)的一种形式,是一种自顶向下(Top-Down)的思考方式,通常采用递归的编码形式:既然动态规划有自顶向下(Top-Do ...

  4. 本地训练,开箱可用,Bert-VITS2 V2.0.2版本本地基于现有数据集训练(原神刻晴)

    按照固有思维方式,深度学习的训练环节应该在云端,毕竟本地硬件条件有限.但事实上,在语音识别和自然语言处理层面,即使相对较少的数据量也可以训练出高性能的模型,对于预算有限的同学们来说,也没必要花冤枉钱上 ...

  5. 宏(define)与常量(const)

    既然选择了远方,便只顾风雨兼程. 宏(define) 一. 宏的理解   宏是一种批量处理的称谓.一般说来,宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则 ...

  6. LabVIEW基于机器视觉的实验室设备管理系统(3)

    目录 行动计划 创建用户信息数据库 后面板连线 初始化 确认修改 确认id 判断旧密码是否正确 判断两次输入的新密码是否相同 修改用户数据库中的密码 结尾 效果演示 上一期我们完成了欢迎登录和信息查询 ...

  7. 七天.NET 8操作SQLite入门到实战 - 第四天EasySQLite前后端项目框架搭建

    前言 今天的主要任务是快速下载并安装.NET 8 SDK,搭建EasySQLite的前后端框架. .NET 8 介绍 .NET 8 是 .NET 7 的后继版本. 它将作为长期支持 (LTS) 版本得 ...

  8. Go语言数组与切片学习总结

    一.数组 数组的定义:相同类型的数据集合 go语言中数组的索引从0开始 没有赋值的数值型数组,默认值为0 数组一旦被创建,它的大小就是不可改变的 (1)声明数组与打印 var 变量名 [大小]变量类型 ...

  9. netty整合websocket(完美教程)

    websocket的介绍: WebSocket是一种在网络通信中的协议,它是独立于HTTP协议的.该协议基于TCP/IP协议,可以提供双向通讯并保有状态.这意味着客户端和服务器可以进行实时响应,并且这 ...

  10. Head First Java学习:第九章-构造器和垃圾收集器

    对象的前世今生 对象如何创建.存在何处以及如何让保存和抛弃更有效率. 会述及堆.栈.范围.构造器.超级构造器.空引用等. 1.内存的两个区域:堆和栈 堆(heap):对象的生存空间,又称为可垃圾回收的 ...