HoneyMoose
  • 首页
  • Java
  • Jersey
  • Jira
  • Confluence
  • U.S.
    • USRealEstate
    • U.S. Travel
    • H1B
  • 项目和网站
    • CWIKI.US
    • OSSEZ 社区
    • WIKI.OSSEZ.COM
    • BUG.OSSEZ.COM
    • RSS.OSSEZ.COM
BLOG.OSSEZ.COM
A responsive blog theme focused om user reading experience
Computer Science

Java Optional 初始为空

如果你想对 Optional 进行初始化的话,你可能会考虑使用下面的代码: Optional<QualificationStateLabelInfo> stateSpecificLabel = null; 上面的代码编译和运行都没有问题。 如何初始化 正确的初始化代码是: Optional<QualificationStateLabelInfo> stateSpecificLabel = Optional.empty(); 上面将会把你定义的 Optional 初始化为空。     但是我们会避免使用 null。 https://www.ossez.com/t/java-optional/13975

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

Java 8 开始新增的 Optional 类 - Optional 对象中的返回

使用 get() 来返回一个值 在对 Optional 对象完成一些检查和校验后,我们可以使用 get() 方法来返回对象中的值。 // returning Value With get() @Test public void givenOptional_whenGetsValue_thenCorrect() { Optional<String> opt = Optional.of("HoneyMoose"); String name = opt.get(); assertEquals("HoneyMoose", name); } 与 orElse() 或者 orElseGet() 方法不一样的地方是 get() 只会在 Optional 包装的对象不为 null 的时候返回值,否则这个方法将会抛出一个没有这个元素(no such element exception)的异常 。 @Test(expected = NoSuchElementException.class) public void givenOptionalWithNull_whenGetThrowsException_thenCorrect() { Optional<String> opt = Optional.ofNullable(null); String name = opt.get(); } 上面的方法显示了如何使用 get() 方法来获得 Optional 中元素的典型操作。 我们使用 Optional 的主要原因就是为了避免在程序中出现 Null 对象异常的这种情况,但是 get() 方法的这种操作还是会给你带来空对象异常的。 因此需要注意下这种代码编写方式,也有可能在 JDK 的后续版本中,这个 get() 方法有可能被取消掉,但是目前还不会。   正是因为这种情况,get() 这个方法也有可能出现空对象异常,在编码的时候还是需要注意下的。 使用 filter() 来进行条件返回 我们可以使用 filter() 方法在输出之前进行测试,然后过滤出满足我们条件的返回对象。 这个方法将会使用 Java 提供的谓语(predicate )作为参数来返回 Optional 对象。 如果通过了 Java 提供的谓语(predicate )测试的话,Optional 对象将会被原样返回。 如果,测试的 谓语(predicate )为 False 的话,那么一个空的 Optional 对象将会被返回。 @Test public void whenOptionalFilterWorks_thenCorrect() { Integer year = 2016; Optional<Integer> yearOptional = Optional.of(year); boolean is2016 = yearOptional.filter(y -> y == 2016).isPresent(); assertTrue(is2016); boolean is2017 = yearOptional.filter(y -> y == 2017).isPresent(); assertFalse(is2017); } filter() 方法通常用来处理你不需要的返回,或者处理满足你条件的返回。 例如在对用户电子邮件进行检查,或者用户密码进行检查的时候,我们可以设置这样一个 filter() 过滤器,当不满足我们设置条件的时候,我们让程序返回一个空的对象,以此来设置条件。 让我们看另外一个使用场景,我们希望购买一个调制解调器(modem),但是我们只关注的是价格,我们对信号灯并不敏感 我们希望对调制解调器在满足价格区间的时候获得一个通知: public class Modem { private Double price; public Modem(Double price) { this.price = price; } // standard getters and setters } 让我们让这个对象通过一些代码来检查这个对象是不是满足我们设定的价格区间. 下面的代码是我们不使用 Optional 的时候的代码。 从上面的代码来看,我们需要进行 Null 检查,然后获得价格,然后判断价格,更要命的更极端的情况价格也有可能为 null。 public boolean priceIsInRange1(Modem modem) { boolean isInRange = false; if (modem != null && modem.getPrice() != null && (modem.getPrice() >= 10 && modem.getPrice() <= 15)) { isInRange = true; } return isInRange; } 为了满足 Null 检查的所有条件,我们需要不停的 if 进行判断。我们需要通过这些 if 条件检查来确定是否满足我们的条件,并且这个代码看起来有点郁闷,但是实际上也确实就是这样写的。 @Test public void whenFiltersWithoutOptional_thenCorrect() { assertTrue(priceIsInRange1(new Modem(10.0))); assertFalse(priceIsInRange1(new Modem(9.9))); assertFalse(priceIsInRange1(new Modem(null))); assertFalse(priceIsInRange1(new Modem(15.5))); assertFalse(priceIsInRange1(null)); } 同时,你也有可能忘记某一个检查,比如说价格为 NULL 的时候怎么办。 这个检查在编译的时候是不会提示你的,只有程序真正上线运行了,出现了异常了,你才知道,我又忘记检查空了。 现在我们看看 Optional 中的 filter() 是怎么做的。 public boolean priceIsInRange2(Modem modem2) { return Optional.ofNullable(modem2).map(Modem::getPrice).filter(p -> p >= 10).filter(p -> p <= 15).isPresent(); } 你的程序精简到只需要一行就可以了。 map 这个方法只是简单的从对象中获得值,后面的过滤器才是对获得值进过滤的。 需要注意的是,使用 filter() 不会对输入的参数进行修改。 在我们的用例中,我们非常容易的就从我们的 Model 对象中获得了价格的属性。至于 map() 的使用我们在后面的内容中进行介绍。 针对上面的代码,首先如果对象出现 null 的时候是不会对你程序有任何影响的,还是能一直跑下去的。 其次就是逻辑非常简单,整个逻辑就是对价格进行判断,至于其他的 null 判断都是由 Optional 完成的。 @Test public void whenFiltersWithOptional_thenCorrect() { assertTrue(priceIsInRange2(new Modem(10.0))); assertFalse(priceIsInRange2(new Modem(9.9))); assertFalse(priceIsInRange2(new Modem(null))); assertFalse(priceIsInRange2(new Modem(15.5))); assertFalse(priceIsInRange2(null)); } 最开始的 If 代码也是可以完成价格的判断的,但是这个方法有着自身的缺陷,因此我们使用了…

2022年05月18日 0Comments 12Browse 0Like Read more
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 18Browse 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 19Browse 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 16Browse 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 14Browse 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 13Browse 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 20Browse 0Like Read more
Computer Science

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

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

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

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

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

2022年05月12日 0Comments 21Browse 0Like Read more
12345…193
Newest Hotspots Random
Newest Hotspots Random
Java Optional 初始为空 Java 8 开始新增的 Optional 类 - Optional 对象中的返回 Java 8 开始新增的 Optional 类 - Optional 对象中的异常 Java 8 开始新增的 Optional 类 - Optional 中的方法 Java 8 开始新增的 Optional 类 - 检查 Optional 的值 Java 8 开始新增的 Optional 类 - 创建 Optional 对象
Confluence OGNL 注入漏洞的严重安全问题Java 中的 NaN如何用 Java 判断一个给定的数是不是素数IntelliJ IDEA 如何针对Java 代码快速打印 println是应该是用 Log 还是 Logger 来定义 LogDom4j 如何输出 Document 中的内容到文本
Windows 中 Node.js 中 nvm 的安装配置和使用 网贷回不了头怎么办 'Donut Fries' Are the Dunkin' Donuts Snack We've All Been Waiting Discourse 安装的时候提示 Docker 错误 Confluence 6 为站点禁用匿名用户访问 Confluence 6 使用 WebDAV 客户端来对页面进行操作
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