λ演算的语法和语义_λ和副作用

λ演算的语法和语义

总览

Java 8添加了诸如lambda和类型推断之类的功能。 这使语言不再那么冗长和简洁,但是它带来了更多的副作用,因为您不必对自己的工作做得那么明确。

Lambda的返回类型很重要

Java 8推断闭包的类型。 一种方法是查看返回类型(或是否返回任何内容)。 这可能会产生令人惊讶的副作用。 考虑下面的代码。

es.submit(() -> {try(Scanner scanner = new Scanner(new FileReader("file.txt"))) {String line = scanner.nextLine();process(line);}return null;
});

此代码可以正常编译。 但是,该行返回null; 似乎多余,您可能会想删除它。 但是,如果删除该行,则会出现错误。

Error:(12, 39) java: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown

这是在抱怨FileReader的使用。 返回null与捕获未捕获的异常有什么关系!

类型推断

ExecutorService.submit()是一个重载方法。 它有两种采用一个参数的方法。

  • ExecutorService.submit(Runnable runnable);
  • ExecutorService.submit(Callable callable);

这两个方法都没有参数,那么javac编译器如何推断lambda的类型? 它查看返回类型。 如果返回null; 它是Callable <Void>,但是如果不返回任何内容(甚至不返回null),则它是aRunnable。

Callable和Runnable还有另一个重要的区别。 Callable引发检查异常,但是Runnable不允许引发检查异常。

返回null的副作用是您不必处理已检查的异常,这些异常将存储在Future <Void> Submit()返回中。 如果不返回任何内容,则必须处理已检查的异常。

结论

尽管lambda和类型推断会删除大量的样板代码,但您会发现更多的边缘情况,在这种情况下,编译器推断的隐藏细节可能会造成一些混乱。

脚注

您可以使用类型转换明确说明类型推断。 考虑一下:

Callable<Integer> calls = (Callable<Integer> & Serializable) () -> { return null; }
if (calls instanceof Serializable) // is true

这种石膏有许多副作用。 不仅call()方法返回一个Integer并且添加了标记接口,为lambda生成的代码也发生了变化,即它添加了writeObject()和readObject()方法来支持lambda的序列化。

注意:每个调用站点都会创建一个新类,这意味着此强制转换的详细信息在运行时通过反射可见。

翻译自: https://www.javacodegeeks.com/2014/09/lambdas-and-side-effects.html

λ演算的语法和语义

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339844.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机系统中存储管理是,《计算机操作系统5、存储管理.doc

《计算机操作系统5、存储管理一、选择题1&#xff0e;存储器管理的主要功能是内存分配、地址映射、内存保护和( )。A&#xff0e;2&#xff0e;把逻辑地址转变为内存的物理地址的过程称作( )A&#xff0e; D&#xff0e;重定位3&#xff0e;物理地址对应的是( )。A&#xff0e;…

怎么调用获取被创建的预制体_Go 语言 Web 编程系列—— 获取用户请求数据(上)...

0、GET/POST 请求数据在 PHP 中&#xff0c;可以直接通过全局变量 $_GET 和 $_POST 快速获取 GET/POST 请求数据&#xff0c;GET 请求数据主要是 URL 查询字符串中包含的参数&#xff0c;以前面在线论坛项目的群组详情页为例&#xff1a;http://localhost:8080/thread/read?id…

Java 8 –集合sort()方法–按Employe对象(Id,名称,年龄)列出自定义排序示例...

有关在Java中对自定义对象进行排序的完整指南。 Collections.sort&#xff08;&#xff09;方法基于Comparable或Comparator实现进行排序。 用于对Employee对象进行排序的示例自定义排序 1.简介 在本教程中&#xff0c;您将学习如何在java中对Custom对象进行排序 。 首先&…

删除表报正在使用_U盘拔出要不要点quot;安全删除USB硬件quot;退出?

小U盘&#xff0c;大用处。U盘不仅可以用来存储各种各样的文件&#xff0c;甚至还可以用来制作电脑启动盘、Win to Go系统盘等。直接拔还是点“安全删除”后再拔U盘呢&#xff1f;在用完U盘后&#xff0c;有的会点击电脑右下角“安全删除”才拔&#xff0c;有的则会不管那么多直…

cpu性能测试软件 国际象棋,CPU性能评测软件

作者选择100电脑网推荐配置了解最佳配置看首页电脑CPU的评测软件有很多&#xff0c;一般用户用的鲁大师就是国内家喻户晓比较流行的评测软件&#xff0c;但是鲁大师的权威性一直没有被市场充分肯定。在windows系统出到vista后&#xff0c;windows内置了电脑性能评分&#xff0c…

java 参数命名冲突_Java中的命名参数

java 参数命名冲突创建具有许多参数的方法是一个主要的缺点。 每当需要创建这样的方法时&#xff0c;就在空气中闻一闻&#xff1a;这是代码的味道。 强化单元测试&#xff0c;然后进行重构。 没有借口&#xff0c;没有屁股。 重构&#xff01; 使用构建器模式&#xff0c;甚至…

react获取全局_使用react hooks实现的简单全局状态管理

注意,此代码存储库已被弃用,不会再更新维护了.Note that this code repository has been deprecated and will not be updated and maintained.react-simple-global-state-store-hook基于react hooks 和EventTarget 实现的极简全局状态管理 库&#xff0c;可以跨组件共享全局状…

职业规划测试软件,生涯规划常用测试工具

原标题&#xff1a;生涯规划常用测试工具认识自己测试生涯规划关于生涯规划的几个测试上周我们说到中学生很有必要进行生涯规划&#xff0c;在进行生涯规划前&#xff0c;我们需要对自己有一个更清晰、更全面的认识&#xff0c;随着心理学的发展&#xff0c;很多认识自我的测试…

使用SoapUI调用不同的安全WCF SOAP服务-基本身份验证,第一部分

在这个分为三部分的系列中&#xff0c;我将演示如何使用SoapUI API工具来调用安全的WCF SOAP服务。 第一篇文章将着重于创建将要测试的系统的服务。 第二篇文章将介绍在基本身份验证机制保护的情况下调用它所需的步骤。 在最后一部分中&#xff0c;我将对初始服务稍作更改&…

计算机动画分为关键帧动画和,一个最简单的动画最少有几个关键帧

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。一个最简单的动画至少有两个关键帧&#xff0c;两个关键帧中必须是元件&#xff0c;而且必须是同一个元件。要创建使组合体或文字发生颜色渐变的动画&#xff0c;必须先将它们转换为…

python+robotframework_python+robot framework接口自动化测试

转载&#xff1a;http://www.cnblogs.com/nzg-noway/p/6651957.htmlpythonrequests实现接口的请求前篇已经介绍&#xff0c;还有不懂或者疑问的可以访问目前我们需要考虑的是如何实现关键字驱动实现接口自动化输出&#xff0c;通过关键字的封装实现一定意义上的脚本与用例的脱离…

自动装箱和拆箱_自动装箱

自动装箱和拆箱自Java 1.5以来&#xff0c;所有Java开发人员都可以使用自动装箱功能。嗯&#xff0c;我可能太乐观了。 至少所有开发人员都应该可以使用自动装箱。 毕竟&#xff0c;在ORACLE页面上有一个很好的教程。 自动装箱是指Java编译器在需要时自动从原始类型创建用于创…

计算机网络标准体系,计算机网络标准体系结构实验报告.doc

华北电力大学实 验 报 告||试验名称 计算机网络体系结构试验课程名称 计算机网络体系结构||专业班级&#xff1a;网络1202 学生姓名&#xff1a;学 号&#xff1a; 成 绩&#xff1a;指导老师&#xff1a;李丽芬 试验日期&#xff1a;.12.18一、试验目标和要求1&#xff0e;将网…

配置中文_星球大战:战机中队配置需求公布 支持中文

近日《星球大战》系列新作《星球大战&#xff1a;战机中队》公布&#xff0c;该作采用寒霜引擎打造&#xff0c;支持中文。游戏将于2020年10月3日发售&#xff0c;预购价格为238元&#xff0c;登陆Xbox One/PS4/PC(Steam/Origin/Epic)平台&#xff0c;有单人和多人模式&#xf…

为什么在生产中进行硒自动化测试对于您的下一个版本至关重要?

您是否认为仅仅是因为您的Web应用程序在过渡环境中以鲜艳的色彩通过了&#xff0c;您的生产环境也将是相同的吗&#xff1f; 您可能需要重新考虑&#xff01; 特别是&#xff0c;如果我们指的是跨浏览器测试 &#xff0c;则需要确保跨各种操作系统&#xff0c;运行在不同操作系…

手机usb共享计算机网络连接,如何将手机wifi网络通过USB共享给电脑?小编教你共享方法...

曾经就有过这样的情况&#xff0c;家里突然断网了&#xff0c;这时又需要打开电脑接收文件&#xff0c;或是需要在线编辑公众号的文章&#xff0c;着急得很&#xff0c;这时电脑没有网络怎么办呢&#xff1f;能不能使用手机的流量&#xff0c;来让电脑连网呢&#xff1f;有时候…

为全局变量赋值_实例分析如何远离漫天飞舞的全局变量

前篇《由static来谈谈模块封装》基本实现了对外隐藏属性&#xff0c;隐藏局部模块函数&#xff0c;开放接口的功能。对于这个话题还有些点没有深入探讨&#xff1a;为什么要这样做&#xff1f;以及这样做的好处。或许很多刚刚开始用C或者其他面向对象编程语言(比如C)的小伙伴们…

数据库班级字段怎么定义名称_班级名称

数据库班级字段怎么定义名称在Java中&#xff0c;每个类都有一个名称。 类位于包中&#xff0c;这使我们程序员可以一起工作&#xff0c;避免名称冲突。 我可以命名我的班级A &#xff0c;也可以命名您的班级A &#xff0c;只要它们位于不同的程序包中&#xff0c;它们可以很好…

计算机指令取决,不同的计算机,其指令不同,这主要取决于什么?

不同的计算机&#xff0c;其指令系统也不同&#xff0c;这主要取决于所用的CPU。1、CPU指中央处理器&#xff0c;是一块超大规模的集成电路&#xff0c;是一台计算机的运算核心(Core)和控制核心( Control Unit)。它的功能主要是解释计算机指令以及处理计算机软件中的数据。2、程…

python内存管理方法_Python 内存管理大揭秘

前言语言的内存管理是语言设计的一个重要方面。它是决定语言性能的重要因素。无论是C语言的手工管理&#xff0c;还是Java的垃圾回收&#xff0c;都成为语言最重要的特征。这里以Python语言为例子&#xff0c;说明一门动态类型的、面向对象的语言的内存管理方式。对象的内存使用…