用了这么久的 Java,也体验了 Java 8 的 lambda 带来的便捷,但是我一直都是直接用,而从未想过他是如何实现的。比如:为什么在小括号里面可以放一个函数作为参数,自己造一个lambda 应该怎么组织代码?

开始

自定义 Lambda 表达式只需要一个接口即可,不需要编写实现类

@FunctionalInterface

interface Greet {

void say(String toWho);

}

然后我们找个地方使用这个接口

public class LambdaApp {

public static void sayHello(String name, Greet greet) {

greet.say(name);

}

}

搞个 Main 方法测一下

public class LambdaApp {

public static void sayHello(String name, Greet greet) {

greet.say(name);

}

public static void main(String[] args) {

LambdaApp.sayHello("tqz", (x) -> {

System.out.println("Hello " + name);

});

}

}

输出

Hello tqz

虽然没有写实现类,但是我们通过 lambda 传入的 System.out.println("Hello " + name); 语句,就在编译的时候变成了接口的实现类的语句,所以还是要一个实现接口的语句的

于是,我们可以定义更加复杂的实现方法作为参数传给接口,附上完整代码

/*** Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)*/

public class LambdaApp {

public static void sayHello(String name, Greet greet) {

greet.say(name);

}

// 自定义 sayHello 里面的 say 方法的实现 public static void selfSayImpl(String name) {

// 省略大段代码。。。 System.out.println("Hello " + name);

// 省略大段代码。。。 }

public static void main(String[] args) {

LambdaApp.sayHello("tqz", (x) -> {

LambdaApp.selfSayImpl(x);

});

}

}

@FunctionalInterface

interface Greet {

void say(String toWho);

}

原理解析

这里已经有人写好了,我只总结一下https://blog.csdn.net/jiankunking/article/details/79825928​blog.csdn.net

总结:在原 class 里面,先搞一个 final 静态内部类实现该接口,然后再生成一个静态方法,方法里面的内容就是 { } 里面传的东西。然后上面这个内部类的实现方法会调用该静态方法。

最终原来的 ( ) -> { } 会被替换成 new 内部类( )

一句话,因为 Java 的 Lambda 是语法糖,所以编译器会自动为你编写实现类,实现方法!

可以看出该过程十分费劲,所以!使用 Lambda 会拖慢程序运行速度!

算法比赛千万别用 Lambda!

java 自定义表达式_自定义 Java Lambda相关推荐

  1. java 时间表达式_【JAVA】Quartz中时间表达式的设置

    Quartz中时间表达式的设置-----corn表达式 时间格式: ,   分别对应: 秒>分>小时>日>月>周>年, 举例: 1.每天什么时候执行: 0 59 2 ...

  2. java lam表达式_详细分析Java Lambda表达式

    在了解Lambda表达式之前我们先来区分一下面向对象的思想和函数式编程思想的区别 面向对象的思想: 做一件事情,找一个能解决这个事情的对象,调用他的方法来解决 函数时编程思想: 只要能获取到结果,谁去 ...

  3. java lambda表达式_高性能的 Lambda 表达式,简洁优雅图文并茂

    来源:知乎 Mingqi 链接:https://www.zhihu.com/question/20125256/answer/324121308 有网友问,Lambda 表达式有何用处?如何使用?在P ...

  4. java自定义配置文件_自定义配置文件如何配置

    @Component public class RoleDirectiveModel implements TemplateDirectiveModel { /** * * @param enviro ...

  5. java自定义配置文件_基于java读取并引用自定义配置文件

    基于java读取并引用自定义配置文件 首先在resources目录创建自定义的配置文件 配置文件的格式: 写工具类,得到配置参数 import java.io.IOException; import ...

  6. java 复合方法_《Java 8 实战》Ch3: Lambda表达式(下):类型与限制、方法引用、复合...

    李文轩 2019-04-23 3.5 类型的检查和判断:变量捕获限制 类型检查 Lambda的类型是从使用Lambda的上下文推断出来的. Lambda表达式需要的类型称为目标类型 . Lambda表 ...

  7. java import自定义类_自定义类加载器-从.class和.jar中读取

    一. 类加载器 JVM中的类加载器:在jvm中,存在两种类加载器, a) Boostrap ClassLoader:这个是由c++实现的,所以在方法区并没有Class对象的实例存在.用于加载JAVA_ ...

  8. java list 自定义类型转换_使用Java Stream API将List按自定义分组规则转换成Map的一个例子...

    本文完整测试代码见文末. 测试数据是List里的4个员工对象实例: 根据员工所在的城市进行分组: 结果分成了三组: 第一组的员工在上海: 第二组的员工在成都: 统计每组员工个数: 把员工进行分组,得分 ...

  9. java算术表达式_一文了解如何用 Java 进行算术表达式计算

    (给ImportNew加星标,提高Java技能) 编译:ImportNew/唐尤华 如何用Java计算"5+3"."10-40"."10*3" ...

最新文章

  1. 2020-08-20 CountVectorizer 包含示例 API
  2. Linux安装Oracle11G
  3. DirectX API 编程起步 #01 项目设置
  4. 95后热搜哪些事,夸克用AI引擎发布2021年度关键词
  5. 如何进阶一名有竞争力的程序员?
  6. eclipse中将java项目变成web项目
  7. php视频教程打包下载 - 网络上最好的php视频教程
  8. 如何进行信息化项目需求调研
  9. 【模糊回归预测】基于matlab萤火虫算法优化模糊神经网络回归预测【含Matlab源码 2034期】
  10. input标签 设置纯数字输入
  11. 什么是批标准化 (Batch Normalization)
  12. Java版Word开发工具Aspose.Words功能解析:查找和替换Word文档中的文本
  13. 网络监控系统安装的六种传输方式
  14. 如何磁盘格式化?分享格式化U盘的3个方法
  15. 租传奇手游服务器网站,传奇手游服务端
  16. Android 集成微信登陆不走回调onResp
  17. 知识蒸馏之自蒸馏【附代码】
  18. 基于压缩感知的单像素相机
  19. 互联网产品经验小分享——关于“虚荣指标”的思考(2020.8.3)
  20. 某村庄供水工程设计(设计报告+cad图纸+预算工程量清单)

热门文章

  1. php 腾讯云 短信验证码发送
  2. SparkSql-redis:将查询到的结果保存到redis中
  3. reason: 'Multiplier is not finite! That's illegal. multiplier:nan' *** First throw call stack:
  4. start with connect by prior的使用方法
  5. 【绘图】3D点图 及绘图关系matplotlib中plt系列
  6. vertica MySQL_Vertica数据库 安装 | 学步园
  7. 佛祖保佑永无Bug—— 最好用的注释插件
  8. 《架构设计2.0大型分布式系统架构方法论与实践》三高笔记
  9. 那些年你追过的女神:开发人员应该懂多少运维
  10. Drawboard PDF常见问题以及使用技巧(持续更新)