Java8的lambda(2)
来源:互联网 发布:极装吉住靠谱吗 知乎 编辑:程序博客网 时间:2024/05/16 14:03
在开始之前,我先普及一下什么是Single Abstract Method interfaces (SAM Interfaces).简单的说就是只用一个函数的interface。
例如Runnable,Comparable等;
例如下面一个:
package functional;@FunctionalInterfacepublic interface SimpleFuncInterface { public void doWork(); public String toString();}
lambda就是通过MethodHandle来实现的。
那么在运行的过程中,它是什么样子的呢?
看看下面的例子:
package functional;public class SimpleFunInterfaceTest2 {public static void main(String[] args) {// lambdacarryOutWork(() -> sleep());carryOutWork(() -> sleep());}private static Object sleep() {try {Thread.sleep(1500);} catch (InterruptedException e) {e.printStackTrace();} return null;}public static void carryOutWork(SimpleFuncInterface sfi) {sfi.doWork();}}
在Thread.sleep那一行打个断点,这时的堆栈是:
"main" #1 prio=5 os_prio=0 tid=0x00e9cc00 nid=0x5e8 at breakpoint[0x001cf000]
java.lang.Thread.State: RUNNABLE
at functional.SimpleFunInterfaceTest.sleep(SimpleFunInterfaceTest.java:24)
at functional.SimpleFunInterfaceTest.lambda$0(SimpleFunInterfaceTest.java:20)
at functional.SimpleFunInterfaceTest$$Lambda$1/7599890.doWork(Unknown Source)
at functional.SimpleFunInterfaceTest.carryOutWork(SimpleFunInterfaceTest.java:34)
at functional.SimpleFunInterfaceTest.main(SimpleFunInterfaceTest.java:20)
JVM会生成一个7599890实例来实行对应的lambda,如果你再起一个同样的程序,这时的堆栈和第一次是一样的;
如果在第二次嗲用carryOutWork的Thread.sleep上停住的话,这是的堆栈就不一样了,如下图:
这是为什么呢?这是因为两次调用carryOutWork方法,都会在class文件中生成两个lambda方法,所以这里的实例对象不一样;
一个是25332239,一个是7599890.这里的数字应该是根据什么lambda的位置和实现的interface名字生成的,同一个lambda在不同的JVM实例中生成的数字是一样的,
这里应该就是CallSite了。
但是你如果想只生成一个lambda的话,应该怎么办呢?
SimpleFuncInterface sfi = () -> sleep();carryOutWork(sfi);carryOutWork(sfi);
- Java8的lambda(2)
- Java8的lambda(1)
- Java8的lambda(3)
- Java8的lambda(3)
- java8的lambda表达式
- Java8 lambda的列子
- java8 lambda表达式(2)
- Java8新增的Lambda表达式
- Java8 的lambda 和 Stream
- Java8引入的lambda表达式
- Java8中Lambda的用法
- 一、java8的Lambda表达式
- Java8新增的Lambda表达式
- Java_ Java8 的 lambda 表达式
- 学习java8的lambda表达式
- java8中lambda的使用
- Java8学习之旅2---基于Lambda的JDBC编程
- java8 Lambda
- 浏览器的UserAgent
- QT 多线程程序设计
- 找到了多个与名为“Home”的控制器匹配的类型
- 数据库笔记(二)
- Maven如何手动添加依赖的jar文件到本地Maven仓库
- Java8的lambda(2)
- UCI机器学习库和一些相关算法 | 丕子
- MFC如何使用GDI+,button加载png
- Web前端开发热门技术(持续更新)
- 虚拟机ubuntu部署hadoop2.2.0伪分布(1)
- POJ 1001 Exponentiation [解题报告] Java
- lucene教程简介
- 计算机网络的虚拟局域网,静态路由,RIP路由,NAT实验
- Java打包成jar,并且通过exe4j做成exe文件,然后利用inno做成setup文件