当前位置:  开发笔记 > 编程语言 > 正文

Java 8中Optional类型的有效用法

如何解决《Java8中Optional类型的有效用法》经验,为你挑选了2个好方法。

这是Java 8中Optional类型的有效(预期)用法吗?

String process(String s) {
    return Optional.ofNullable(s).orElseGet(this::getDefault);
}

Stuart Marks.. 20

我会再接下来.

这是有效用法吗?是的,从狭义上讲,它会编译并产生您期望的结果.

这是用途吗?不,现在,有时事情发现它们的用处超出了原来的范围,如果这样做有效,那就太好了.但是Optional,因为我们发现通常情况不会很好.

Brian Goetz和我讨论Optional了JavaOne 2015演讲中的一些问题,使用Java 8 Lambdas和Streams进行API设计:

链接到视频

链接到幻灯片

主要用途Optional如下:(幻灯片36)

可选的目的是为库方法返回类型提供一种有限的机制,其中明确需要表示"无结果",并且使用它的方式绝对可能导致错误.null

从a链接方法的能力Optional无疑是非常酷的,并且在某些情况下它减少了条件逻辑的混乱.但通常情况下这并不成功.一个典型的代码味道是不是使用方法链接的代码,处理Optional一些方法返回,它创建了一个Optional从东西是空的,以连锁方式,避免条件语句.这是一个实际的例子(也来自我们的演示文稿,幻灯片42):

// BAD
String process(String s) {
    return Optional.ofNullable(s).orElseGet(this::getDefault);
}

// GOOD
String process(String s) {
    return (s != null) ? s : getDefault();
}

使用的方法Optional更长,并且大多数人发现它比传统代码更加模糊.不仅如此,它还没有充分的理由造成额外的垃圾.

底线:仅仅因为你可以做某事并不意味着你应该这样做.



1> Stuart Marks..:

我会再接下来.

这是有效用法吗?是的,从狭义上讲,它会编译并产生您期望的结果.

这是用途吗?不,现在,有时事情发现它们的用处超出了原来的范围,如果这样做有效,那就太好了.但是Optional,因为我们发现通常情况不会很好.

Brian Goetz和我讨论Optional了JavaOne 2015演讲中的一些问题,使用Java 8 Lambdas和Streams进行API设计:

链接到视频

链接到幻灯片

主要用途Optional如下:(幻灯片36)

可选的目的是为库方法返回类型提供一种有限的机制,其中明确需要表示"无结果",并且使用它的方式绝对可能导致错误.null

从a链接方法的能力Optional无疑是非常酷的,并且在某些情况下它减少了条件逻辑的混乱.但通常情况下这并不成功.一个典型的代码味道是不是使用方法链接的代码,处理Optional一些方法返回,它创建了一个Optional从东西是空的,以连锁方式,避免条件语句.这是一个实际的例子(也来自我们的演示文稿,幻灯片42):

// BAD
String process(String s) {
    return Optional.ofNullable(s).orElseGet(this::getDefault);
}

// GOOD
String process(String s) {
    return (s != null) ? s : getDefault();
}

使用的方法Optional更长,并且大多数人发现它比传统代码更加模糊.不仅如此,它还没有充分的理由造成额外的垃圾.

底线:仅仅因为你可以做某事并不意味着你应该这样做.



2> ajb..:

由于这或多或少是一个基于意见的问题,我会把我扔进去.如果你想说的话

if (id == 1) {
    Foo f = new Foo(id, "Bar", "US");
    return "Bar".equals(f.getName()) && "US".equals(f.getCountryCode());
} else {
    return false;
}

然后就这么说吧.使事物"功能化"不会自动使事情更清晰或更好.通过介绍一个不必要的Optional,一些lambdas,以及一些Optional我必须查找的方法,你已经使代码更复杂和难以理解.我不认为Java的设计者"有意"让人们使用它Optional来帮助使代码更加模糊.

编辑:阅读一些回复后,我认为值得添加一些评论.这不是我熟悉的函数式编程习惯,这将使其更难理解.我的成语熟悉大多涉及Java流,或(在其他语言)的阵列或列表或多个值的其他集合应用于多个值功能成语.在这些情况下,一旦你超越了陌生程度,功能语法就可以看作是一种改进,因为它允许隐藏一些细节(循环索引,迭代器,运行指针,累加器变量).总的来说,它可以简化事情.这个例子本身并没有做任何这样的简化.

但是,某些Optional功能在流上下文中很有用.假设我们有一个parseInt()返回an 的方法,Optional如果输入字符串无效,则该方法为空.(Java 8确实应该提供这个.)这样可以很容易地获取一个字符串数组并生成一个整数数组,其中不解析的字符串只是从结果中删除 - parseInt在流中使用map(),并且使用流过滤器过滤掉空Optionals.(我已经看到了多个StackOverflow问题,询问如何执行此操作.)如果您只想保留正值,则可以使用a Optional.filter()将非存款更改为Optional.empty()使用流过滤器之前(尽管在这种情况下,您可以添加另一个流之后过滤,但在更复杂的情况下,Optional过滤器可能更有用).Optional从功能的角度来看,这就是我认为的主要好处.它允许您一次处理一组值,方法是为您提供一种表示"非值"的方法,并编写一个仍然可以使用它们的函数.所以我想Optional除了替换之外,主要用途是null在一系列值中表示空格,同时将函数应用于整个序列.

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有