可选类型API

Java 8引入了Optional类。 简而言之,不是返回null,而是检查null,而是返回Optional实例,该实例可以设置或不设置值。 这样,您就不会因NullPointerException而失败。

我不会讨论Optional类型是否会完全消除NPE(不会)。 相反,我将从另一个角度讨论问题-API设计。 除了Java的Optional之外,我还将显示guava的Optional和scala的Option ,并进行比较。

正如Joshua Bloch所建议的,API应该尽可能小,但不能小。 API的概念权重应最小化,如果您想知道是否在API中包含某些内容,则应将其忽略。 API应该易于使用,并且难以滥用,并且理想情况下应该具有一个(或两个)主要使用模式。 Optional类型是必须做出所有这些选择的一个很好的例子。

这的默认用法是什么? 您将获得一个可选类型,并且仅在设置了值的情况下才想执行一些代码。 您显然可以通过将它与null进行比较来做到这一点,但是您常常会忘记这一点,而可选类型迫使您意识到此值实际上是可以设置的。 第二个重要用例是,如果未设置默认值,则能够轻松提供默认值。

让我们首先从三个方面中最差的一个开始(我认为)– scala的Option 。 最初,此类似乎为您提供了许多功能。 但是,正如scala的正常做法一样,有很多不同的方法来使用类,但没有一种方法比其他方法更好。 对我而言,这种情况下特别糟糕的决定是使Option (隐式)转换为Iterable 。 对于非scala开发人员,让我们假设它是Iterable 。 但是它只能有一个或零个元素。 因此,为了实现我们的默认和最常见的用例,我们提供以下选项:

  • if (option.nonEmpty) {option.get.doSomething()}请使用命令式样式
  • 使用.foreachoption.foreach(v => v.doSomething)
  • 使用foreach循环(与上述不同): for (value <- option) {value.doSomething()}
  • 使用a来理解(用于…收益率)(与上述两项不同)
  • 使用模式匹配- case Somecase None
  • 使用地图,折叠,收集等–这使过程更进一步–不仅获得了价值,而且还对其应用了一些功能

因此,从可选类型的基本概念来看,我们有一个包含数十种方法的类。 这个API在概念上很重要。 没有明显的首选方法可以处理最常见的情况,实际上,许多scala开发人员首选的方法使用某种形式的foreach,当您知道最多有一个值时,这听起来有些怪异。

现在,让我们继续第二名候选人-Java 8 Optional 。 您只有两种使用方法:使用if子句的命令式检查和ifPresent(function)方法,其中提供了一个在有​​值时处理代码的函数。 您还可以使用几个重载方法来提供默认值(第二个用例)。 我不喜欢的是mapflatMapfilter方法。 与上面的scala一样,它们很有用,但是可以将它们忽略(并且单独使用它们的用法,几乎不会增加冗长性),或者可以将它们简化为一个函数-map。 它与flatMap有细微的差别,并且过滤单个元素并不是最有用的方法,此外,您可以使用map函数来实现。

我知道,到目前为止,您可能已经准备好(恼怒地)问您将如何编写非常简洁的代码,而无法折叠,收集,flatMap,过滤器。 在使用给定的可选类型执行操作后返回另一个可选类型是第三个用例,这对于长方法很重要。 它不如其他两个常见,因此应注意较少。 理想情况下,一种方法就够了–所有其他子用例都可以在map函数本身中处理。

因此,我们找到了赢家–番石榴Optional 。 它仅具有处理第一个用例的必要方法(因为它是为缺少一流功能的Java版本开发的)。 上面的第二个和第三个用例具有尽可能少的方法( ortransform(..) )。 轻量级API,可以用相同数量的代码实现几乎相同的事情。

实际上,针对主要用例采用功能性方法不一定是好方法–拥有Optional类型的意义在于无法在功能上起作用–关键是要意识到价值可能不存在。 我并不是说要在scala和Java8中摆脱它,但也许可以重新考虑.isPresent().get()

最重要的是–很难设计API。 就简单的事情而言,就算是可选类型,也有很多方面需要考虑主要和次要美国用例,以及是否需要便捷方法,或者它们为API添加了不必要的复杂性,并且可以用其他方法处理(不是一定更冗长)。

最后-在可能返回null的情况下使用可选类型-NPE易于调试和修复,但容易遗漏并且可能在错误的时刻发生。

翻译自: https://www.javacodegeeks.com/2014/03/the-optional-type-api.html

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

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

相关文章

计算机社团活动丰富多彩,描写社团丰富多彩的句子

我们学校的社团活动真是丰富多彩用这个句子开头试着写一段话感恩生命&#xff0c;感谢她给予我们丰富的感情。喜怒哀乐&#xff0c;悲思忧惧&#xff0c;洒洒脱脱&#xff0c;原原本本&#xff0c;痛快淋漓&#xff0c;无拘无束&#xff1b;喜而笑&#xff0c;怒而吼&#xff0…

宝元系统u盘使用说明_教你如何使用U盘安装电脑系统

①到老毛桃官网首页下载老毛桃UEFI版u盘启动盘制作工具安装到电脑上&#xff1b;②准备一个容量在4G以上并能够正常使用的u盘。1第一步将u盘插入电脑usb接口&#xff0c;程序会自动扫描&#xff0c;我们只需在下拉列表中选择用于制作的u盘&#xff0c;然后点击“一键制作”按钮…

IP通信基础 4月1日

广域网数据链路控制规程 1.面向字符型传输规程 2.面向比特型传输规程 面向比特型传输规程分析 帧 标志字段F 地址字段A 控制字段C 信息字段TNFO 帧检验序列FCS 标志字段F 1Byte 1Byte 1Byte 可变长 2Byte 1Byte…

输入人民币/美元后自动判断,输出转换后相对应的值

1 2 作者&#xff1a;pasaulis3 版本&#xff1a;v2.04 日期&#xff1a;2018.11.75 功能&#xff1a;输入人民币/美元后自动判断&#xff0c;输出转换后相对应的值6 7 in_str_valueinput(请输入人民币/美元金额&#xff08;格式示例&#xff1a;100rmb/100usd&#xff09;)9 u…

支持在iPad中播放的HTML5视频网站推荐

YouTube是最早支持HTML5视频的网站&#xff0c;随着iPad等平板电脑的流行&#xff0c;越来越多的视频网站开始支持HTML5视频播放。下面就向大家分享一些国内的HTML5视频网站&#xff0c;是根据网上信息整理而成&#xff0c;欢迎大家反馈和推荐更多的HTML5视频网站。 腾讯 优酷…

自定义Log4j 2.0

我们越来越接近Log4j 2 GA版本&#xff0c;因此&#xff0c;我们应该开始研究它会给我们带来什么。 我个人有很多理由对Log4j 2.0感到兴奋。 社区很棒&#xff0c;Apache许可证给了我很多自由&#xff0c;最后它受到Apache软件基金会的保护。 嘿&#xff0c;这是一个很棒的软件…

计算机斐波那流程图,循环结构——斐波那契数列.DOC

循环结构——斐波那契数列循环结构——斐波那契数列1&#xff0e;教学目标根据新课标的要求和学生的认知特点&#xff0c;确定本节课的教学目标。(1)知识与技能学生能理解循环结构概念&#xff1b;把握循环结构的三要素&#xff1a;循环的初始状态、循环体、循环的终止条件&…

为什么用链路聚合_H3C ComwareV7平台网络设备可靠性配置——链路聚合

H3C ComwareV7平台网络设备可靠性配置——链路聚合链路聚合简介&#xff1a;链路聚合是通过多个物理接口(通常指以太网接口&#xff0c;串口只在特定场景且与以太网聚合技术等同故不再赘述)捆绑实现的逻辑接口&#xff0c;而这些被捆绑在一起的以太网接口就称为该聚合组的成员端…

用php实现一个双向队列

队列是一种线性表&#xff0c;按照先进先出的原则进行 单向队列&#xff1a;只能从头进&#xff0c;从尾出 双向队列&#xff1a;头尾都可以进出 class DuiLie { private $array array();//声明空数组 public function setFirst($item){ //array_unshift() 函数用于向数组插入…

idea+maven+ssm搭建boot_crm项目遇到的问题

使用ideamavenssm搭建一个boot_crm项目&#xff0c;遇到的问题如下&#xff1a; 1.环境搭建好了&#xff0c;相关配置文件都配置好了&#xff0c;也部署到了tomcat&#xff0c;但是无法启动首页。 通过百度&#xff0c;google找到了&#xff0c;原因是web.xml文件出了问题&…

大型计算机变形,计算机变形病毒的主要特征和发展趋势

计算机变形病毒的主要特征和发展趋势计算机病毒具有一些基本的特性&#xff0c;这些基本特性主要指的是病毒的传染性、破坏性、恶作剧等&#xff0c;这是普通病毒所具备的基本特性&#xff0c;而能用变化自身代码和形状来对抗反病毒手段的变形病毒才是下一代病毒首要的基本特征…

Redis与Jedis排序

在本文中&#xff0c;我们将讨论Redis SORT命令。 Redis提供了SORT命令&#xff0c;我们可以使用该命令从LIST&#xff0c;SET或ZSET中检索或存储排序的值。 我们可以使用最简单的形式在KEY上使用命令&#xff0c;如下例所示&#xff1a; SORT numbers_list这将对键中包含的…

获取 HTML5 网页设计灵感的10个网站推荐

这篇文章向大家推荐10个收集 HTML5 网页作品的网站&#xff0c;让大家感受一下 HTML5 的魅力。作为下一代网页标准&#xff0c;HTML5 增加了很多新标签以及新特性&#xff0c;正引领网页技术革命。希望这些优秀的 HTML5 网页案例能带给大家制作 HTML5 网页的灵感。 HTML5 Gall…

postgresql存图片字段类型_PostgreSQL让人着迷的多态性,另辟蹊径省时又省力

PostgreSQL 让人着迷的地方&#xff0c;不在于他比某些数据库的流行&#xff0c;也不在于比某些数据库的高“贵”&#xff0c; 更不如某些数据库的“简单”。Postgresql 让人无法自拔的是他的”多端变化”&#xff0c; 用开发的角度来说&#xff0c;叫多态性。PG本身支持着太多…

计算机怎么查看U盘品牌,如何查看电脑u盘使用

如何查看电脑u盘使用其实笔记本设置U盘启动也并不困难&#xff0c;小编这就教你怎样设置U盘启动&#xff01;全是硬货&#xff01;第一步&#xff1a;我们先把U盘插入笔记本的USB接口上&#xff0c;(注意&#xff1a;请不要通过USB延长线来连接笔记本)插上U盘后重启笔记本本。电…

Maven补全之生命周期(Lifecycle)

Maven补全之生命周期&#xff08;Lifecycle) Maven生命周期基础概念 Maven是基于生命周期构建的&#xff0c;一个Maven项目的构建是已经被清晰定义的过程。 对于我们使用Maven构建项目来说&#xff0c;POM.xml文件可以确保我们得到自己想要的项目&#xff08;项目名&#xff0c…

嵌入式-第一季-第2课

第二课 嵌入式系统概述 一&#xff0e;核心概念 嵌入式系统是&#xff08;1&#xff09;以应用为中心&#xff0c;以计算机技术为基础&#xff0c;&#xff08;2&#xff09;软硬件可剪裁&#xff0c;对&#xff08;3&#xff09;功能、可靠性、成本、体积、功耗严格要求的专用…

善用封盖

不久前&#xff0c;在博客文章中 &#xff0c;我解释了Groovy中的Closure。 这篇博客文章将解释一个使用它们的好例子。 最近&#xff0c;我发现自己不得不为服务AJAX请求的大量后端Controller API编写相同的异常处理逻辑。 就像这样&#xff1a; class ApiRugbyPlayerControl…

12款精美的免费 HTML 网站模板下载

这篇文章收集了12款精美的免费HTML网站模板分享给大家&#xff0c;您可以免费下载使用。相信这些漂亮的HTML网站模板既能够帮助您节省大量的时间和精力&#xff0c;又能有很满意的效果。感谢那些优秀的设计师分享他们的劳动成果&#xff0c;让更多的人可以使用他们的创意设计&a…

两个数相乘积一定比每个因数都大_小升初数学知识点大全含公式+20类必考应用题(含答案解析),孩子考试一定用得上!...

小升初数学知识点大全含公式一、几何图形周长、面积和体积公式*三角形的面积&#xff1d;底高2。S ah2正方形的面积&#xff1d;边长边长 S a长方形的面积&#xff1d;长宽 公式 S ab平行四边形的面积&#xff1d;底高 S ah梯形的面积&#xff1d;(上底下底)高2 S(ab)h2内角和&…