可选和对象:空指针救星!

没有人喜欢空指针异常 我们有办法摆脱它们吗?
也许 。



这篇文章中讨论了几种技术:

  • 可选类型(Java 8中的新增功能)
  • 对象类(旧的Java 7东西!)

Java 8中的可选类型

它是什么?

  • Java 8中引入的一种新类型(类)
  • 打算充当特定类型的对象或没有对象(空)的方案的“ 包装器

用简单的话来说,它是处理空值的更好替代品警告 :起初可能不是很明显!)

基本用法

它是一种类型(一个类)–那么,如何创建它的实例?

只需在Optional类中使用三个静态方法。

public static Optional<String> stringOptional(String input) {return Optional.of(input);
}

简单明了–创建一个包含值的Optional包装器。 当心–如果值本身为null,将抛出NPE!

public static Optional<String> stringNullableOptional(String input) {if (!new Random().nextBoolean()) {input = null;}return Optional.ofNullable(input);
}

我个人认为好一点。 这里没有NPE的风险–如果输入为空,则将返回空的 Optional。

public static Optional<String> emptyOptional() {return Optional.empty();
}

如果您要有目的地返回“空”值。 'empty'并不意味着null

好了–使用/使用Optional怎么样?

public static void consumingOptional() {Optional<String> wrapped = Optional.of("aString");if (wrapped.isPresent()) {System.out.println("Got string - " + wrapped.get());}else {System.out.println("Gotcha !");}
}

一种简单的方法是检查Optional包装器是否具有实际值(使用isPresent方法)–这将使您想知道它是否比使用if(myObj!= null)好 。 不用担心,我也会解释这一点。

public static void consumingNullableOptional() {String input = null;if (new Random().nextBoolean()) {input = "iCanBeNull";}Optional<String> wrapped = Optional.ofNullable(input);System.out.println(wrapped.orElse("default"));
}

如果包装的值为null,则可以使用orElse来返回默认值,这是显而易见的。 我们避免了在提取实际值之前调用ifPresent的明显冗长。

public static void consumingEmptyOptional() {String input = null;if (new Random().nextBoolean()) {input = "iCanBeNull";}Optional<String> wrapped = Optional.ofNullable(input);System.out.println(wrapped.orElseGet(() -> {return "defaultBySupplier";}));
}

我对此有些困惑。 为什么要使用两种单独的方法来实现相似的目标? orElseorElseGet很可能已被重载 (相同名称,不同参数)。

无论如何,这里唯一明显的区别是参数本身–您可以选择提供一个Lambda表达式来表示Supplier <T> (功能接口)的实例。

与常规的空值检查相比,使用Optional更好吗?

  • 总的来说,使用Optional的主要好处是能够清楚地表达您的意图 -简单地从方法中返回null会使消费者在怀疑是否故意的时候(当实际的NPE出现时)充满了疑惑。并且需要对Javadocs进行进一步的内省(如果有)。 借助Optional,其水晶般清晰
  • 有以下几种方式可以完全避免NPE与可选-在上面的例子中所提到的,使用Optional.ofNullable(可选创建过程中)和否则容易orElseGet(可选消费过程中)从NPE上保护我们一起

另一个救星!

(以防您无法使用Java 8)

查看此代码段。

package com.abhirockzz.wordpress.npesaviors;import java.util.Map;
import java.util.Objects;public class UsingObjects {String getVal(Map<String, String> aMap, String key) {return aMap.containsKey(key) ? aMap.get(key) : null;}public static void main(String[] args) {UsingObjects obj = new UsingObjects();obj.getVal(null, "dummy");}
}

什么可能为空?

  • 地图对象
  • 执行搜索所依据的密钥
  • 在其上调用方法的实例

在这种情况下抛出NPE时,我们永远无法确定什么是null

输入对象类

package com.abhirockzz.wordpress.npesaviors;import java.util.Map;
import java.util.Objects;public class UsingObjects {String getValSafe(Map<String, String> aMap, String key) {Map<String, String> safeMap = Objects.requireNonNull(aMap,"Map is null");String safeKey = Objects.requireNonNull(key, "Key is null");return safeMap.containsKey(safeKey) ? safeMap.get(safeKey) : null;}public static void main(String[] args) {UsingObjects obj = new UsingObjects();obj.getValSafe(null, "dummy");}
}

requireNonNull方法:

  • 如果它不为空,则简单地返回值
  • 如果值为null,则将向NPE投掷指定的消息

为什么这比if(myObj!= null)更好

您将看到的堆栈跟踪将明显具有Objects.requireNonNull方法调用。 这以及您的自定义错误消息将帮助您更快地发现错误。 。 .IMO快得多!

您也可以编写用户定义的检查,例如,实施强制执行非空性的简单检查

import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.function.Predicate;public class RandomGist {public static <T> T requireNonEmpty(T object, Predicate<T> predicate, String msgToCaller){Objects.requireNonNull(object);Objects.requireNonNull(predicate);if (predicate.test(object)){throw new IllegalArgumentException(msgToCaller);}return object;}public static void main(String[] args) {//Usage 1: an empty string (intentional)String s = "";System.out.println(requireNonEmpty(Objects.requireNonNull(s), (s1) -> s1.isEmpty() , "My String is Empty!"));//Usage 2: an empty List (intentional)List list =  Collections.emptyList();System.out.println(requireNonEmpty(Objects.requireNonNull(list), (l) -> l.isEmpty(), "List is Empty!").size());//Usage 3: an empty User (intentional)User user = new User("");System.out.println(requireNonEmpty(Objects.requireNonNull(user), (u) -> u.getName().isEmpty(), "User is Empty!"));
}private static class User {private String name;public User(String name){this.name = name;}public String getName(){return name;}}
}

不要让NPE在错误的地方痛苦。 我们拥有一套不错的工具来更好地处理NPE或完全消除它们!

干杯!

翻译自: https://www.javacodegeeks.com/2014/09/optional-and-objects-null-pointer-saviours.html

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

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

相关文章

oracle 存储过程的基本语法 及注意事项

oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字( 参数1 IN NUMBER, 参数2 IN NUMBER) IS变量1 INTEGER :0;变量2 DATE;BEGIN END 存储过程名字2.SELECT INTO STATEMENT 将select查询的结果存入到变量中&#xff0c;可以同时将多个列存…

function——函数声明头的提升和预解析

函数&#xff1a; 即function语句的集合&#xff0c;就是将多个语句封装到一起&#xff1b; 函数的执行要会自己遍历&#xff0c;遇见函数 a&#xff08;&#xff09;&#xff1b;执行语句&#xff0c;就要移交控制权&#xff0c;函数执行完毕之后&#xff0c;控制权又移交回…

在JDeveloper 12.1.3中将Java API用于WebSockets

介绍 最新版本的JDeveloper 12c&#xff08;12.1.3.0&#xff09;和WebLogic Server 12.1.3一起提供了一些新的Java EE 7功能。 其中之一是对用于WebSocket的JSR 356 Java API的支持。 实际上&#xff0c;从12.1.2.0版本开始就支持WebSocket协议&#xff08;RFC 6455&#xff0…

基于Verilog语言的伪随机码的编写

写之初&#xff0c;笔者并没有太大的自信&#xff0c;因为笔者对伪随机码并没有太多的认识。但老师有命&#xff0c;笔者不得不进行编写&#xff0c;同时笔者也特别希望能有个项目来锻炼自己。 笔者在开始编写的时候&#xff0c;首先上网查了很多的资料&#xff0c;对伪随机码算…

【HBuilder】手机App推送至Apple App Store过程

一、前言 最近由于公司同事离职&#xff0c;顶替这位同事从事手机App的研发工作&#xff0c;BIM数据平台部门采用的是HBuilder作为手机App的制作环境。本篇介绍我是如何将HBuilder的Release包发布至App Store的。 二、内容 1. 首先登录Apple Developer网站 2. 点击iTunes Conn…

Java性能调优调查结果(第四部分)

这是系列文章中的最后一篇&#xff0c;我们将分析我们在2014年10月进行的Java Performance Tuning Survey的结果。如果您还没有阅读第一篇文章&#xff0c;我建议您首先阅读以下内容&#xff1a; 性能问题的频率和严重性 最受欢迎的监控解决方案 查找根本原因的工具和技术 …

2012年第一个工作日

换代理尝试&#xff0c;竟然可以发博客了。以前的博客太散乱&#xff0c;打算在这里安家。 今天花了一上午时间&#xff0c;在各大网站不停地晃。希望自己能够弄清楚这个快速变化的世界。 2012确切的目标&#xff1a; 1. 工作仍然是首要的&#xff0c;锻炼的能力不同而已&#…

基于ArcEngine的插件式框架

先整理下&#xff0c;过几天把我以前用过的一个插件式GIS框架共享出来。转载于:https://www.cnblogs.com/songhuaiyu/archive/2010/08/16/1800854.html

【JQuery】选择器

一、前言 上一章学习完了Js的一些基本内容&#xff0c;本章开始学习JQuery语法。JQuery的基础语法是&#xff1a; $(selector).action() 那么重要的两个元素&#xff0c;一个是选择器&#xff0c;另一个是行为&#xff01;本章开始学习JQuery的选择器。 二、内容 $("*&quo…

android eclipse 配置 在项目右击选择properties

转载于:https://www.cnblogs.com/guoxiaoyue/p/3485243.html

减少主要GC暂停的频率

这篇文章将讨论一种技术&#xff0c;以减少应用程序等待时间造成的垃圾收集暂停的负担。 正如我几年前所写&#xff0c; 在JVM中无法禁用垃圾收集 。 但是&#xff0c;有一个巧妙的技巧可以用来大大减少长时间停顿的时间和频率。 如您所知&#xff0c;JVM中发生了两个不同的GC…

软件工程中交流的思考

良好的交流可以有效的降低项目的开发成本&#xff0c;相反不但可能数倍的增加成本&#xff0c;甚至可能导致项目的失败。 怎样在项目执行过程进行有效的交流呢&#xff1f; 1. 识别项目中交流主体。 2. 明确交流主题、内容、目标。 3. 做好交流记录、分析、整理、执行。 4. 交流…

【WebGL】《WebGL编程指南》读书笔记——第2章

一、前言 最近看了《WebGL编程指南》这本书&#xff0c;发现还是很有意思的&#xff0c;故每章阅读后做个笔记。 二、正文 Example1&#xff1a;在canvas中绘制2D矩形 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" /&…

一个人的网站开发

从零开始开发一个全栈Web应用实录 https://blog.csdn.net/weixin_31347831/article/details/74625813 如何用PHP完整的开发一个网站&#xff1f; https://blog.csdn.net/a6984021/article/details/88787885 一个人如何完成一整个网站的开发&#xff08;推荐好文&#xff0c;看完…

WAI-ARIA对自动完成小部件的支持

在本文中&#xff0c;我想讨论AutoComplete小部件的可访问性。 在您键入该字段时&#xff0c;通常会使用“自动完成”窗口小部件提供建议。 在当前的工作中&#xff0c;我基于Twitter的Typeahead &#xff08;一个灵活JavaScript库&#xff09;实现了JSF组件&#xff0c;该库为…

eclipse中java.lang.OutOfMemoryError: Java heap space错误

Myeclipse中报java.lang.OutOfMemoryError: Java heap space错误 解决办法: 选中被运行的类&#xff0c;点击菜单‘run->run Configuration’&#xff0c;选择(x)Argument标签页下的vm arguments框里 输入 -Xmx800m, 保存运行。问题解决 转载于:https://www.cnblogs.com/vig…

[Vue warn]: Invalid prop: custom validator check failed for prop xxx.问题

在用vue ui框架&#xff08;iview、elementui等&#xff09;做项目&#xff0c;会遇到这种问题 这样的&#xff0c;点那都报错&#xff0c;千辛万苦的付出&#xff0c;却找不到问题在哪 其实很简单&#xff0c;报错都显示出那个组件的问题了 ‘<Form>’这个组件&#xf…

CheckList 如何梳理可减少上线的验证时间(总结篇)

对CheckList的执行发起的思考&#xff1f; &#xff08;1&#xff09;功能越来越多&#xff0c;CheckList越补充越多&#xff0c;执行CheckList时间越来越长&#xff0c;如何减少上线的验证时间&#xff1f;&#xff08;2&#xff09;减少上线验证的时间外&#xff0c;如何保证…

PrimeFaces 5.0 DataTable列切换器

我有机会与PrimeFaces 5.0 DataTable一起工作&#xff0c;并且增强功能很棒。 今天&#xff0c;我只想展示其中的一项新功能……DataTable列切换器。 此功能使您可以通过复选框列表选择显示哪些列。 要使用列切换器&#xff0c;只需添加一个commandButton即可将列选择的选择列…

[恢]hdu 2016

2011-12-14 04:21:57 地址&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2016 题意&#xff1a;中文。 mark&#xff1a;wa了2次&#xff0c;a^b^a^b这种交换只能用在a和b不同的时候&#xff0c;否则清零。没考虑第一个元素就是最小值的情况。 代码&#xff1a; # in…