这是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
更长,并且大多数人发现它比传统代码更加模糊.不仅如此,它还没有充分的理由造成额外的垃圾.
底线:仅仅因为你可以做某事并不意味着你应该这样做.
我会再接下来.
这是有效用法吗?是的,从狭义上讲,它会编译并产生您期望的结果.
这是用途吗?不,现在,有时事情发现它们的用处超出了原来的范围,如果这样做有效,那就太好了.但是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
更长,并且大多数人发现它比传统代码更加模糊.不仅如此,它还没有充分的理由造成额外的垃圾.
底线:仅仅因为你可以做某事并不意味着你应该这样做.
由于这或多或少是一个基于意见的问题,我会把我扔进去.如果你想说的话
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()
,并且使用流过滤器过滤掉空Optional
s.(我已经看到了多个StackOverflow问题,询问如何执行此操作.)如果您只想保留正值,则可以使用a Optional.filter()
将非存款更改为Optional.empty()
使用流过滤器之前(尽管在这种情况下,您可以添加另一个流之后过滤,但在更复杂的情况下,Optional
过滤器可能更有用).Optional
从功能的角度来看,这就是我认为的主要好处.它允许您一次处理一组值,方法是为您提供一种表示"非值"的方法,并编写一个仍然可以使用它们的函数.所以我想Optional
除了替换之外,主要用途是null
在一系列值中表示空格,同时将函数应用于整个序列.