作家
登录

在Java中使用Lambda表达式的技巧

作者: 来源: 2017-08-10 14:43:18 阅读 我要评论

如不雅实现的 Callable.call 在运行时抛出一些异常,只要它们被捕获到就没什愦问题。

尽管有如许的办法来实现功能,但照样推荐下面的用法:

只有当调用代码包管不存在异常时,才能隐蔽已检查的异常,才能调用响应的代码。

下面的例子演示了这种办法:

 

这个办法是这个对象的完全实现,在这里它作为开源项目SNAMP的一部分。

应用 Getter 和 Setter

这一节对不合数据格局(如 JSON,Thrift 等等)的序列化/反序列化的编写对象有效。此外,如不雅你的代码严重依附了为 JavaBean 的 getter 和 setter 预备的 Java 反射,那么它及其有效。

getter 是在 JavaBean 中的一个应用 getXXX 定名的无参且非 Void 返回类型的办法、setter 是在 JavaBea n中的一个应用 setXXX 定名的有一个零丁参数并返回 void 类型的办法。这两个符号可以被表示为函数的接口:

  • 一个 getter 可以被表示为一个函数的参数是 this 引用的 Function 。
  • 一个 setter 可以被表示为一个第一个参数是 this 引用,第而个参数是被传进 setter 的值的 BiConsumer。

如今,我们创建两个办法,这两个办法可以把任何 getter 或 setter 转换为这些函数的接口。无论这两个函数接口是不是通用。只要类型擦除掉落之后,真实的类型都等于一个对象。主动的结垢荷琐返回类型和可以被 LambdaMetafactory 识其余参数。此外,uava's Cache 赞助为雷同的 getter 或 setter 缓存 lambdas 。

我们都知道,Java 供给的所有函数接口不支撑检查异常。检查与未检查异常在 Java 中打着持久战。

起首,必须为 getter 和 setter 声明一个缓存。大年夜 Reflection API 上看,Method 表示一个真实的 getter 或 setter,并且做为一个 Key 被应用。在缓存中的值代表对于特定的 getter 或 setter 的动态构造函数接口。

其次,创建工厂办法经由过程大年夜办法句柄中指向一个 getter 或 setter 来创建一个函数接口的实例:

当然,invokedynamic 指令并不是专门给 Java 中的 lambda 表达式来应用的。惹人该指令主如果为了可以在 JVM 之上运行的动态说话。Java 所供给的 Nashorn JavaScript 引擎开箱即竽暌姑,就大年夜大年夜地应用了该指令。

然后,为这些工厂具有缓存的支撑,创建一个门面:

作为应用 Java 反射 API 的 Method 实例,获取的办法信息可以轻松地转换为 MethodHandle。推敲到实例办法老是有隐蔽的第一个参数用于将其传递给办法。静态办法没有这些隐蔽的参数。例如,Integer.intValue()办法具有 int intValue 的实际签名(Integer this)。这个技能用于实现 getter 和 setter 的功能包装器。

如今是时刻测试代码了:

这种应用缓存的 getter 和 setter 的办法可以在诸如 Jackson 如许的序列豢?状序列化库中高效的应用,这些库在序列化/反序列化库的过程中应用 getter 和 setter。

应用 LambdaMetafactory 来动态生成的实现调用函数接口比经由过程 Java Reflection API 的调用快 得多

你可以在这里找到完全的代码,它是开源项目 SNAMP 的一部分。

限制和缺点

在本节中,我们将给出在 Java 编译器和 JVM 中与 lambdas 相干的一些缺点和限制。 所有这些限制都可以在 OpenJDK 和 Oracle JDK 上重现,它们实用于 Windows 和 Linux 的 javac 1.8.0_131。

如你所知,可以应用 LambdaMetafactory 动态构建 lambda。要实现这一点,你应当指定一个 MethodHandle,个中包含一个由函数接口声明的单个办法的实现。我们来看看这个简单的例子:

膳绫擎代码等价于: 

但如不雅我们用一个可以表示一个字段获取办法的办法处理器来调换指向 getValue 的办法处理器的话,情况会若何呢:

该代码应当是可以按照预期来运行的,因为 findGetter 会返回一个指向字段获取办法、并且具备有效签名的办法处理器。 然则如不雅你运行了代码,就会看到如下异常:

有趣的是,如不雅我们应用 MethodHandleProxies,字段获取办法却可以运行得很好:


  推荐阅读

  阿里云发布ECS企业级产品家族 19款实例族涵盖173个应用场景

为知足企业级客户对计算的高标准需求,8月9日,阿里云正式宣布云办事器ECS企业级产品家族,今朝已推出面向173种企业应用处景的19款实例。该系列合适在复杂的企业计算情况下,知足对于高机>>>详细阅读


本文标题:在Java中使用Lambda表达式的技巧

地址:http://www.17bianji.com/lsqh/36645.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)