Lambda-in-Java

通过Demo演示出Lambda语法在Java中的魅力(使用需要JDK1.8以上)
  • 用Lambda语法写线程
  • Lambda表达式 为button添加ActionListener
  • 使用Comparator接口排序
  • 自定义接口实现
  • forEach
    • filter过滤删选
    • Predicate(准备条件)
    • 并行处理和顺序处理
  • 探讨Lambda是否为语法糖

语法
(1) 形参列表。如果没有参数()表示
(2) ->
(3) 代码块

用Lambda语法写线程

快速启动(输出其实并不重要)

mvn compile exec:java -Dexec.mainClass=com.upic.LambdaTest.ThreadLambda

原来线程实现:

new Thread(new Runnable() {@Overridepublic void run() {System.out.println("Thread");}}).start();

通过Lambda实现

new Thread(() -> {System.out.println("Lambda Thread");}, "ThreadName-1").start();Runnable r=()->{System.out.println("Runnable");};r.run();
 代码量简洁了不少

Lambda表达式 为button添加ActionListener

原来的添加:

button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("你好!" );}});

Lambda:

button.addActionListener(e -> System.out.println("你好!"));

使用Comparator接口排序

原来的写法:

Collections.sort(list, new Comparator<String>() {// 使用新的排序规则 根据第二个字符进行逆序排@Overridepublic int compare(String a, String b) {if (a.charAt(1) <= b.charAt(1)) {return 1;} else {return -1;}}});

Lambda写法:

// lambda会自动推断出 a,b 的类型Collections.sort(list, (a, b) -> a.charAt(1) < b.charAt(1) ? 1 : -1);list.forEach(str -> {System.out.println(str);});

自定义接口实现

快速启动

mvn compile exec:java -Dexec.mainClass=com.upic.LambdaTest.LambdaImp

代码

@FunctionalInterface
public interface ILambda {public int add(int i,int j);
}

实现:

ILambda l=(i,j)->i+j;
System.out.println(l.add(1, 2));

Lambda forEach写法

快速启动

mvn compile exec:java -Dexec.mainClass=com.upic.LambdaTest.CompareSort
//部分代码
list.forEach(it->System.out.println(it));

Lambda好朋友Steam

stream就是JAVA8提供给我们的对于元素集合统一、快速、并行操作的一种方式。
它能充分运用多核的优势,以及配合lambda表达式、链式结构对集合等进行许多有用的操作。

filter过滤筛选

快速运行

mvn compile exec:java -Dexec.mainClass=com.upic.lanbdaSteam.LambdaSteam

说明:

筛选一个list里相应条件的对象

Predicate(准备条件)

快速运行

mvn compile exec:java -Dexec.mainClass=com.upic.lanbdaSteam.PredicateFilter

部分代码

Predicate<User> ageFilter = (p) -> (p.getAge() > 50);
Predicate<User> positionFilter = (p) ->(p.getPosition().equals(Position.SOLDIER.toString()));

说明:

“多条件筛选” “多条件筛选再限制个数”
筛选出年龄大于五十岁且是战士的人

并行处理和顺序处理:

快速运行:

mvn compile exec:java -Dexec.mainClass=com.upic.lanbdaSteam.DoTestPerformance

说明

计算1~200W数字能余2的结果集,serial:单行处理 parallel:并行处理

探讨Lambda是否为语法糖

现在java语法糖有很多,包括泛型、自动装/拆箱、forEach等,都是java的语法糖,让开发人员更好的去理解,便与开发;

那么我们的lambda语法是不是也是语法糖,我拿一个类com.upic.LambdaTest.SortList做测试,
源代码:

public static void newSort() {// lambda会自动推断出 a,b 的类型Collections.sort(list, (a, b) -> a.charAt(1) < b.charAt(1) ? 1 : -1);list.forEach(str -> {System.out.println(str);});}public static void main(String[] args) {// oldSort();newSort();for(String s:list){System.out.println(s);}
加了个For,为了待会反编译查看结果做对比

反编译之后:

public static void newSort() {Collections.sort(list, (a, b) -> {return a.charAt(1) < b.charAt(1) ? 1 : -1;});list.forEach((str) -> {System.out.println(str);});}   public static void main(String[] args) {newSort();Iterator arg1 = list.iterator();while (arg1.hasNext()) {String s = (String) arg1.next();System.out.println(s);}}

Lambda语法没有发生任何改变。而for循环经过编译后就改写成这样了。

查看类字节码结构的时候发现一个指令

 14: invokedynamic #59,  0             // InvokeDynamic #1:accept:()Ljava/util/function/Consumer;

Invokedynamic是jdk1.7引入的指令,Invokedynamic先在运行时动态解析出调用点限定符所引用的方法,然后再执行该方法,指令的分派逻辑是由用户所设定的引导方法决定的。
会引出MethodHandler、MethodType的概念,这个我明天或者后天写几个demo放上来。

下面的事class字节码结构中的:

0: #121 invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lan
g/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Lja
va/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/Metho
dType;)Ljava/lang/invoke/CallSite;

通过MethodHandles动态调用的。

所以Lambda不是语法糖

完工,请大家多多指教!star下

Lambda-in-Java相关推荐

  1. Lambda表达式Java教程

    在本文中,我们提供了全面的Lambda Expressions Java教程. 1. Lambda Expressions Java教程–简介 Lambda表达式被认为是Java 8中引入的最好的功能 ...

  2. 带有AWS Lambda和Java的无服务器FaaS

    什么是无服务器架构? 无服务器架构在由第三方完全管理的临时容器中运行自定义代码. 自定义代码通常只是完整应用程序的一小部分. 也称为函数 . 这为无服务器架构提供了另一个名称,即功能即服务 (FaaS ...

  3. java中sam接口_具有非SAM接口的lambda的Java习惯用法

    在Java中,使用lambda而不是匿名类可以优雅地实现具有单个抽象方法(即SAM类型或功能接口)的接口: // SAM ActionListener with anonymous implement ...

  4. python中的lambda 和java中的lambda有什么不同?lambda相关介绍

    不知道大家有没有想过:为什么java一直到jdk8才推出lambda表达式 而python很早就有! 事实上.Python设计上函数就是一个对象,作为一门OO语言它要比Java纯粹得多,Java这种不 ...

  5. lambda表达式 java 效率_Java8新特性效率之Lambda

    1.我的环境如下: CPU:I5-2430M 2.4GHz 双核四线程 内存:8G JDK版本:1.8.0_25 2.生成数据的核心代码 一个Student类,只有一个age属性,一个方法,是根据参数 ...

  6. 精通lambda表达式:java多核编程_Java8 Lambda表达式和流操作如何让你的代码变慢5倍...

    有许许多多关于 Java 8 中流效率的讨论,但根据 Alex Zhitnitsky 的测试结果显示:坚持使用传统的 Java 编程风格--iterator 和 for-each 循环--比 Java ...

  7. 精通lambda表达式:Java多核编程pdf

    下载地址:网盘下载 内容简介  · · · · · · lambda表达式权威指南 <精通lambda表达式:Java多核编程>介绍Java SE 8中与lambda相关的特性是如何帮助J ...

  8. java 8 lambda reduce_[Java 8] (10) 使用Lambda完成函数组合,Map-Reduce以及并行化

    好文推荐!!!!! 原文见:http://blog.csdn.net/dm_vincent/article/details/40856569 Java 8中同时存在面向对象编程(OOP)和函数式编程( ...

  9. lambda表达式java项目常用_一文带你彻底搞懂Lambda表达式

    1. 为什么使用Lambda表达式 Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风 ...

  10. Lambda for Java

    Lambda 是一项计算服务,可使您无需预配置或管理服务器即可运行代码.AWS Lambda 只在需要时执行您的代码并自动缩放,从每天几个请求到每秒数千个请求.您只需按消耗的计算时间付费 – 代码未运 ...

最新文章

  1. java web dao_JavaWeb项目,DAO应该怎么写?
  2. 特斯拉“刹车失灵”不绝于耳网络营销外包怎样看特斯拉进驻中国?
  3. hadoop/hive/hbase 简单区别及应用场景
  4. HZOJ 赤(CF739E Gosha is hunting)
  5. boost::fusion::vector用法的测试程序
  6. 计算机网络原理第二章笔记,计算机网络原理笔记 第三章 数据链路层(一)
  7. JavaScript玩转机器学习:Node 中的 TensorFlow.js
  8. 传说有位游客在山顶大声谈论着小孤嫁彭郎的故事
  9. 300万像素导航机 喏羁押2268跌破1500
  10. Oracle如何实现利用实体化视图提高查询性能
  11. phpstudy使用mysql8.0_windows系统-phpstudy升级mysql8.0.12安装教程及修改密码和安装注意事项...
  12. 线性代数笔记2:基本子空间的正交性及性质
  13. QCC3040 BLE bonding相关配置
  14. 谷歌浏览器怎么保存网页本身或链接?
  15. 清华软院保研机试总结
  16. Android 解析Excel (xls格式)
  17. 2023/1/2总结
  18. java从入门到精通----OOP 2
  19. golang编辑器查看git哪一行是谁修改的,什么时候修改的方法
  20. sql server 2017数据库复习:第六章-数据库设计(需求分析、概念结构设计(ER图)、逻辑结构设计)+练习题

热门文章

  1. ubuntu php 时区设置,Linux_Ubuntu8.10命令行下如何修改时区信息(图),在Ubuntu 8.10下如何更改时区和 - phpStudy...
  2. 手机计算机字体变大,大师应对手机百度如何设置字体大小?
  3. sql盲注自动化脚本编写
  4. Himall商城安装帮助类AES加密解密(1)
  5. 十大经典预测算法(一)----线性回归
  6. matlab中图像的阈值分割,基于MATLAB的图像阈值分割技术汇总
  7. 36 剑指offer--链表--两个链表的第一个公共结点
  8. kettle教程---kettle作业调度,根据更新时间增量更新
  9. 计算机考研复试常问问题 编程语言篇
  10. 智能体——探索人工智能世界的奇妙存在