HoneyMoose
  • 首页
  • Java
  • Jersey
  • Jira
  • Confluence
  • U.S.
    • USRealEstate
    • U.S. Travel
    • H1B
  • 项目和网站
    • CWIKI.US
    • OSSEZ 社区
    • WIKI.OSSEZ.COM
    • BUG.OSSEZ.COM
    • RSS.OSSEZ.COM
Computer Science
Computer Science

Java 8 开始新增的 Optional 类 - Optional 对象中的异常

使用 orElseThrow() 处理异常 在 orElse() 和 orElseGet() 方法之外,JDK 还添加了一个 orElseThrow() 方法,JDK 使用这个方法来处理对象为空的情况。 如果 Optional 的对象为 null 的话,orElse() 和 orElseGet() 是返回一个默认值,我们可以使用 orElseThrow() 来抛出一个异常。 考察下面的代码,在 Optional 为空的时候,异常是如何抛出的。 @Test(expected = IllegalArgumentException.class) public void whenOrElseThrowWorks_thenCorrect() { String nullName = null; String name = Optional.ofNullable(nullName).orElseThrow( IllegalArgumentException::new); } 这个异常处理方法是从 Java 8 开始提供的,可以通过在构造来传入异常。 Java 10 以后,还推出了一个更加简单的没有参数的 orElseThrow() 版本的方法。 这样的话,如果 Optional 对象为空的话,我们可以抛出一个 NoSuchElementException 异常: @Test(expected = NoSuchElementException.class) public void whenNoArgOrElseThrowWorks_thenCorrect() { String nullName = null; String name = Optional.ofNullable(nullName).orElseThrow(); } https://www.ossez.com/t/java-8-optional-optional/13968

2022年05月17日 0Comments 62Browse 0Like Read more
Computer Science

Java 8 开始新增的 Optional 类 - Optional 中的方法

fPresent() 的使用条件 ifPresent() 方法能够让我们在对对象进行下一步操作之前判断我们需要操作的对象是否为 Null,在没有 Optional 对象之前,我们通常使用下面的方法先进行判断: if(name != null) { System.out.println(name.length()); } 上面的程序逻辑是,首先判断 name 这个变量是不是为空,如果不为空的话,允许程序继续执行下一步。 这种判断方法不是很美观,代码也比较难看,更重要的是这种判断方法也是容易出错的。 有谁又能够保证我们在检查空,并且打印出变量后,这个变量不被再次使用呢,在这个变量再次使用的时候又有谁能够保证我们不会忘记空检查呢? 同时,有可能在程序的运行时导致空对象异常,NullPointerException。尤其是在程序因为输入的问题导致失败,无法启动的情况下,通常这种情况是因为程序本身没有被很好的设计和编码。 Optional 能够非常明确的处理可能为空的变量,这个是一种比较好的编码习惯。 让我们看看上面的代码在 Java 8 的环境下是如何进行实现的。 在常用的函数编程的情况下,我们在对象不进行空检查后使用函数式进行编程: @Test public void givenOptional_whenIfPresentWorks_thenCorrect() { Optional<String> opt = Optional.of("HoneyMoose"); opt.ifPresent(name -> LOG.debug("{}", name.length())); } 在上面的示例中,我们仅仅使用了 2 行代码就实现了第一种方法需要使用的 5 行代码。 第一行代码使用 Optional 对象来对我们的变量进行包装,第二行代码就对已经包装好的 Optional 对象进行相应的操作。 orElse() 方法来定义默认值 orElse() 这个方法被用来获取 Optional 实例中内部的值。 这个方法只需要 1 个参数,如果 Optional 对象中的值不为空的话,程序将会返回 Optional 对象中的值,否则将会使用 orElse 这个方法中输入参数的值来替代输出。 当然,你也可以在 orElse() 调用一个方法,至于和 orElseGet() 有什么不同,我们将会在后面进行说明。 考察下面的代码: @Test public void whenOrElseWorks_thenCorrect() { String nullName = null; String name = Optional.ofNullable(nullName).orElse("john"); assertEquals("john", name); } orElseGet() 方法来定义默认值 orElseGet() 和 orElse() 方法类似。 我们都知道,如果 Optional 为空的时候,如果使用 orElse() 方法,将会使用这个方法中输入的参数来替代返回,orElseGet() 就更近一步了。 orElseGet 提供的是一个函数式的接口,你可以在 orElseGet() 中使用函数编程,返回的结果就是这个函数进行运算后的结果。 @Test public void whenOrElseGetWorks_thenCorrect() { String nullName = null; String name = Optional.ofNullable(nullName).orElseGet(() -> "john"); assertEquals("john", name); } orElse() 和 orElseGet() 方法的对比 和很多程序员一样,如果你是开始接触 Java 8 的话,你可能对 orElse() 和 orElseGet() 2 个方法之间的执行不同有所不了解,觉得这 2 个方法在功能上都是重复的。     事实上看起来就是这样的,但是在实际上还是有一些微妙的不同的。 如果你对这些细微的不同不够了解的话,有可能会严重影响你程序的执行效率。 简单来说就是其中定义的函数是否被执行的区别,不管前面对 Optional 的判断是否为 null, orElse() 中调用的方法都会被执行,orElseGet() 却不会。 首先,让我们在测试类中定义一个 getMyDefault() 方法,这个方法不使用任何参数,只是打印并且返回一个字符串: public String getMyDefault() { System.out.println("Getting Default Value"); return "Default Value"; } 然后我们分别使用 orElse() 和 orElseGet() 来进行调用这个方法,我们来看看有什么不同。 Optional 对象为空的情况 @Test public void whenOrElseGetAndOrElseOverlap_thenCorrect() { String text = null; String defaultText = Optional.ofNullable(text).orElseGet(this::getMyDefault); assertEquals("Default Value", defaultText); defaultText = Optional.ofNullable(text).orElse(getMyDefault()); assertEquals("Default Value", defaultText); } 正如我们所看到的,因为 Optional 对象为空,我们定义的函数都被调用了。 程序的输出如下,从程序的输出可以看出来,这 2 个方法的执行是相同的。 The side effect is: Getting default value... Getting default value... Optional 对象不(NOT)为空的情况 使用上面相同的代码,但是这次不同的是,我们定义的 Optional 对象是不为空的 @Test public void whenOrElseGetAndOrElseDiffer_thenCorrect() { String text = "Text present"; LOG.debug("Using orElseGet:"); String defaultText = Optional.ofNullable(text).orElseGet(this::getMyDefault); assertEquals("Text present", defaultText); LOG.debug("Using orElse:"); defaultText = Optional.ofNullable(text).orElse(getMyDefault()); assertEquals("Text present", defaultText); } 如上面的代码所展示的,我们需要判断的 Optional 对象已经不为空了,程序的输出如下所示: Using orElseGet: Using orElse: Getting default value... 注意到 orElseGet() 方法在我们检查 Optional 对象不为空的时候,就不再调用 getMyDefault 这个方法。 然后我们再来看看 orElse() 这个方法,尽管…

2022年05月17日 0Comments 59Browse 0Like Read more
Computer Science

Java 8 开始新增的 Optional 类 - 检查 Optional 的值

检查值是否存在的 isPresent() 和 isEmpty() 方法 当我们使用 Optional 对象的时候,我们可以使用 isPresent() 方法来检查返回的 Optional 对象中是否有值。 Optional 对象可以是你自己创建的,或者是从其他方法中返回的。 @Test public void givenOptional_whenIsPresentWorks_thenCorrect() { Optional<String> opt = Optional.of("HoneyMoose"); assertTrue(opt.isPresent()); opt = Optional.ofNullable(null); assertFalse(opt.isPresent()); } 如果 Optional 对象中的值不为 null 的话,这个方法将会返回 True。 同样的,如果使用 Java 11 的话,你可以使用与 isPresent 相反的方法 isEmpty。 如果你的对象中的值为 null 的话,isEmpty 将会返回 True。 @Test public void givenAnEmptyOptional_thenIsEmptyBehavesAsExpected_JDK11() { Optional<String> opt = Optional.of("Baeldung"); assertFalse(opt.isEmpty()); opt = Optional.ofNullable(null); assertTrue(opt.isEmpty()); } 如果你查看 API 的话,你会看到 JDK 的源代码只是用了简单的判断是否等于 null。   这 2 个方法的使用正好是相反的。   https://www.ossez.com/t/java-8-optional-optional/13966

2022年05月17日 0Comments 50Browse 0Like Read more
Computer Science

Java 8 开始新增的 Optional 类 - 创建 Optional 对象

创建一个 Optional 对象 有下面的一些方法可以被用来创建 Optional 对象。     empty 静态方法 如果你想创建一个空的 Optional 的对象,我们简单的使用 Optional 类提供的 empty() 静态方法: @Test public void whenCreatesEmptyOptional_thenCorrect() { Optional<String> empty = Optional.empty(); assertFalse(empty.isPresent()); } 需要注意的是,我们使用 isPresent() 方法来检查 Optional 对象中值的情况。 如果我们创建的 Optional 对象有值的话,isPresent() 方法将会返回 True,否则 isPresent() 这个方法将会返回 False。 我们将会在本页面的后续部分继续讨论有关 isPresent() 方法的使用。 of 静态方法 下面的方法将会创建一个 Optional 对象,在创建这个对象的时候,我们使用了另外的一个静态方法 of() 来进行创建: @Test public void givenNonNull_whenCreatesNonNullable_thenCorrect() { String name = "HoneyMoose"; Optional<String> opt = Optional.of(name); assertTrue(opt.isPresent()); } 需要注意的是,如果你使用 of 静态方法创建一个 Optional 对象的时候,你还是有机会面临空对象(NullPointerException)异常。 考察下面的代码,如果运行的话,你还是会命令到空对象异常,如果你初始化 Optional 为空的话。 @Test(expected = NullPointerException.class) public void givenNull_whenThrowsErrorOnCreate_thenCorrect() { String name = null; Optional.of(name); } ofNullable 静态方法 有时候,我们希望在我们的代码中使用 Null 值。 这个时候,你可以使用静态方法 ofNullable() ,这个静态方法将会告诉 Optional 对象是可能为 Null 的。 @Test public void givenNonNull_whenCreatesNullable_thenCorrect() { String name = "HoneyMoose"; Optional<String> opt = Optional.ofNullable(name); assertTrue(opt.isPresent()); } 通过上面的操作,我们可以在 Optional 使用 null,这样的话,如果你对 Optional 进行初始化的时候,不会因为null 的使用而导致异常。 @Test public void givenNull_whenCreatesNullable_thenCorrect() { String name = null; Optional<String> opt = Optional.ofNullable(name); assertFalse(opt.isPresent()); } https://www.ossez.com/t/java-8-optional-optional/13965

2022年05月17日 0Comments 44Browse 0Like Read more
Computer Science

Java 8 开始新增的 Optional 类

如果你写过一些 Java 代码的话,你应该知道 Java 中最常见的就是空指针异常错误。 这个错误的原因就是你对一个为空的对象进行操作了。 比如说,你有一个 List,但是这个 List 是空对象,如果你要向这个 List 中添加元素或者删除元素的话,你铁定会遇到空对象的异常。 Optional 类是一个可以为 NULL 的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。 Optional 是个容器:它可以保存类型T的值,或者仅仅保存 NULL。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。     Optional 类的引入很好的解决空指针异常。 概述 在本指南中,我们针对 Optional 来进行一些探讨。 Optional 这个类最新是从 Java 8 中引入的,其主要目的如上面我们介绍的,就是为了解决 Java 中广受诟病的空异常。 Java 从 类型级别(type-level) 给出了一个解决方案,用来替代 null。 In this tutorial, we’re going to show the Optional class that was introduced in Java 8. 如果你还想对 Java 的 Optional 了解更多的话,你可以直接访问 Oracle 提供的官方 API,访问地址为: Tired of Null Pointer Exceptions? Consider Using Java SE 8's Optional!   文章列表 因 Optional 有关的内容比较多,请通过下面的链接访问具体的小主题: Java 8 开始新增的 Optional 类 - 创建 Optional 对象 Java 8 开始新增的 Optional 类 - 检查 Optional 的值 Java 8 开始新增的 Optional 类 - Optional 中的方法 Java 8 开始新增的 Optional 类 - Optional 对象中的异常 Java 8 开始新增的 Optional 类 - Optional 对象中的返回 Java 8 开始新增的 Optional 类 - Optional 在 Java 8 中的 Chaining 特性 Java 8 开始新增的 Optional 类 - Optional 在 Java 9 中的 API Java 8 开始新增的 Optional 类 - Optional 可能存在的滥用 Java 8 开始新增的 Optional 类 - Optional 对象序列化 结论 如果你按照上面的顺序阅读完成相关文章的话,你应该对在 Java 8 中开始使用的 Optional 类有了一些基本的了解。 同时在这边文章中也对为什么要使用 Optional 对象来替代 null 检查进行了一些说明。 同时我们也对如何从 Optional 中获得值进行了一些说明,同时对如果值是 null ,我应该如何设置默认值使用的 orElse() 和 orElseGet() 方法进行了一些阐述。 最后,我们对 Optional 返回的值如何进行转换进行了描述,在对返回值进行转换的话,我们可能会使用到 map(), flatMap() 和 filter() 方法。 同时我们还对 Optional 的一些特性,方法进行了阐述和说明。 在最后,我们对为什么使用 Optional 为方法的参数是不好的选项的原因进行了说明,并且举例如何避免这个问题。 https://www.ossez.com/t/java-8-optional/13964  

2022年05月15日 0Comments 36Browse 0Like Read more
Computer Science

反向代理 413 Request Entity Too Large 问题

如果在服务器上使用了反向代理。 你可能会收到下面的错误信息: 413 Request Entity Too Large errors`。 问题和解决 问题的原因就是反向代理服务器针对 HTTP 访问的时候有限制, Nginx 在 Nginx 的配置文件中,添加下面的内容 client_max_body_size 100M; 上面的配置信息显示了具体的配置位置。 在默认情况下 Nginx 配置的 client_max_body_size 大小为 1M。 很多时候是肯定不够用的。 Apache Apache 在 http.conf 配置文件中有一个 LimitRequestBody 参数。 你可以将这个参数配置为:LimitRequestBody 104857600。 虽然你成功配置了上面的参数,但是有时候上面的参数在 Apache 中可能没有办法解决你的问题。 这是因为有时候和后台代理的程序也有关系。 总结 根据最近想买的一些调整,使用 Nginx 作为反向代理,会比 Apache 更加轻量,配置更加容易。   https://www.ossez.com/t/413-request-entity-too-large/13963

2022年05月13日 0Comments 45Browse 0Like Read more
Computer Science

看这个情况这块硬盘是要交代了

如果你收到你的存储提示下面的信息。     最好的办法就是先准备一块新的硬盘吧,因为你也不知道你这块硬盘什么时候突然就交代了。   https://www.ossez.com/t/topic/13962

2022年05月13日 0Comments 42Browse 0Like Read more
Computer Science

不知不觉 CDSN 也有了百万访问量了

只关注技术,不知不觉 CDSN 也有了百万访问量了。     今天正好过百万,发个小帖子纪念下吧。 能发点技术路上的心得,帮助帮助有需要的朋友就感觉欣慰了。 也感谢 CSDN 有这么一个平台让搞技术的还有一个 BB 的地方。 虽然有时候也不得不吐槽下 CSDN 的图片上传速度和排版方式,但是抱着有比没有强的心态,可以稍加克服。   https://www.ossez.com/t/cdsn/13961

2022年05月12日 0Comments 91Browse 0Like Read more
Computer Science

快速删除 node_modules

我们都知道 node_modules 文件夹中包含了大量的 node 需要的依赖库。 如果直接使用 Windows 的删除的话,非常耗时。 好在我们可以使用 node 自己提供的一个库来删除。 安装 rimraf rimraf 包的作用:以包的形式包装rm -rf 命令,就是用来删除文件和文件夹的,不管文件夹是否为空,都可以删除。 运行下面的命令来进行全局安装 rimraf npm install rimraf -g 进入需要清理的项目中,运行下面的命令: rimraf node_modules 就可以进行快速删除了。     上面的命令都是在命令行工具上执行的。   https://www.ossez.com/t/node-modules/13959

2022年05月09日 0Comments 81Browse 0Like Read more
Computer Science

Java 项目编译的时候提示 javax.xml.bind.annotation does not exist 错误

提示的错误信息为: javax.xml.bind.annotation does not exist     错误原因 这是因为针对这个老的项目,我们是使用 JDK 11 进行编译的。 但是 JDK 11 中已经没有: javax.xml.bind 这个包。 需要在 POM 的依赖中添加下面的内容: <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.0</version> </dependency>     添加上面的依赖到 POM 文件中就可以解决编译的错误了。   https://www.ossez.com/t/java-javax-xml-bind-annotation-does-not-exist/13958

2022年05月09日 0Comments 59Browse 0Like Read more
12345…167
Newest Hotspots Random
Newest Hotspots Random
网络编程常用的几种字符编码 Java 中的 String Pool 简介 有关 Java 9 的 String Java String 性能和优化 Java String 手工引用指针 Java String 文字(Literal)和 对象(Object)初始化
Jenkins 通过检查代码提交自动触发编译IntelliJ IDEA 2022 年版本中的作者提示Discourse 新用户可插入媒体的数量Discourse 的信任级别Java 使用 char[] Array 还是 String 存储字符串密码Java 字符串引用(String Interning)
数学老师以政府机关里边的空调都要求调到26度为由调空调 美国税务结构 President Erdogan Surprises Turkey With a Snap Election Slated for June 如何确定你的 Windows 平台上是否已经安装了 Python Java String 构造方法中的内存分配 Java 程序员是否必须要掌握 Spring Boot
Categories
  • Akka
  • Algorithm(算法)
  • AMQP
  • Angular
  • CI
  • Compile And CI
  • Computer Science
  • Confluence
  • DataBase
  • Gradle
  • H1B
  • Hibernate
  • IDE
  • Java
  • Jersey
  • Jira
  • MariaDB
  • PrestaShop
  • Spring
  • Spring Batch
  • U.S.
  • U.S. Travel
  • USRealEstate
  • 我的小厨

COPYRIGHT © 2020 HoneyMoose. ALL RIGHTS RESERVED.

THEME CWIKIUS.CN MADE BY VTROIS