在Java 11中使用Optionals避免使用函数链的空指针异常[duplicate]

00jrzges  于 2023-03-11  发布在  Java
关注(0)|答案(2)|浏览(119)

此问题在此处已有答案

Optional of nullable on something giving NullPointerException(1个答案)
What is a NullPointerException, and how do I fix it?(12个答案)
8小时前关门了。
我想使用Java11的Optional来保护自己免受可怕的空指针异常的影响。我写了一个基本的测试来检查我对它们如何工作的理解。

@Test
   public void optionalsWorkingAsExpected() {
       String x = null;
       var y = Optional.ofNullable(x.toString().toLowerCase()).orElse(null);
       assertThat(y).isNull();
   }

但是,此测试失败,出现另一个空指针异常

Cannot invoke "String.toString()" because "x" is null

对于上下文,我希望能够使用这样的函数链:

myClass.getMyData().transformData().getName()

这些函数调用中的任何一个都可能导致为null,并且它们被链接在一起,我并不关心链中哪个为null,但是如果它们中的任何一个为null,我想把null返回给我的变量,就像这样

String name = Optional.ofNullable(myClass.getMyData.transformMyData.getName()).orElse(null);

有什么建议吗?

jvlzgdj9

jvlzgdj91#

我认为快乐歌曲的评论和解决方案的链接是正确的方向。你会希望像这样的东西通过你的测试。

Optional.ofNullable(x).map(Object::toString).map(String::toLowerCase).orElse(null);
weylhg0b

weylhg0b2#

谢谢@happy-song和@kparkinson。Map帮助我找到了正确的方向。对于上下文,这些Map可以像其他Map一样链接起来,如果你想调用

@Test
       public void optionalsWorkingAsExpected() {
        Number x = null;
        String b = "hi there";

        var opt = Optional.ofNullable(x)
                .map(y -> y.toString())
                .map(str -> str.toLowerCase())
                .map(lower -> lower.toUpperCase())
                .orElse(null);

        assertThat(opt).isNull();

        var opt2 = Optional.ofNullable(b)
                .map(y -> y.toString())
                .map(str -> str.toLowerCase())
                .map(lower -> lower.toUpperCase())
                .orElse(null);
        assertThat(opt2).isEqualTo("HI THERE");

    }

相关问题