当前位置: 首页 > 知识库问答 >
问题:

Java 8中可选类型的有效用法

慕佑运
2023-03-14

这是Java8中可选类型的有效(预期)用法吗?

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

共有3个答案

太叔富
2023-03-14

询问它是否“有效”是基于观点的,但至于它是否是预期的用例:不,不是。

Oracle的Java语言架构师Brian Goetz曾表示,可选的用例适用于当您需要“无值”标记时,并且为此使用null可能会导致错误。具体来说,如果您的方法的合理用户不太可能考虑其结果为null的可能性,那么您应该使用可选。它显然不是一个通用的“可能”类型的对象,因为您在这里使用它。

在您的情况下,返回可选值的方法是私有的。这意味着它只能由类的实现者使用,您可以假设他们对类的方法有很好的了解,包括哪些方法可能返回null。由于没有合理的混淆风险,Brian Goetz(可能)会说他不会认为这是一个有效的用例。

瞿博学
2023-03-14

因为这或多或少是一个基于观点的问题,我会把我的问题抛进去。如果你想说

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

那就这么说。让事情“功能性”并不能自动让事情变得更清晰或更好。通过引入不必要的可选、几个lambda和一些我必须查找的可选方法,您使代码更加复杂和难以理解。我不认为Java的设计者“旨在”让人们使用可选来帮助使代码更加模糊。

编辑:在阅读了一些回复后,我认为值得添加一些评论。这不是我熟悉的函数式编程习惯用法,这会使其更难理解。我熟悉的习惯用法主要涉及Java流,或者(在其他语言中)应用于数组或列表中的多个值或多个值的其他集合中的函数式习惯用法。在这些情况下,一旦你克服了不熟悉,函数式语法可以被视为一种改进,因为它允许隐藏一些细节(循环索引、迭代器、运行指针、累加器变量)。所以总的来说,它可以简化事情。这个例子本身并没有做任何这样的简化。

但是,一些可选特性在流上下文中很有用。假设我们有一个parseInt()方法,它返回一个可选

傅博瀚
2023-03-14

我再试试这个。

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

这是预期用途吗?不。现在,有时事情会发现它们的用处超出了最初的用途,如果这能奏效,那就太好了。但是对于可选的,我们发现通常情况下,事情并不顺利。

Brian Goetz和我在我们的JavaOne 2015演讲中讨论了Optional的一些问题,Java 8 Lambda和Streams的API设计

  • 视频链接
  • 链接到幻灯片

可选的主要用法如下:(幻灯片36)

可选旨在为库方法返回类型提供一种有限的机制,其中明确需要表示“无结果”,并且为此使用null极有可能导致错误。

可选链接方法的能力无疑非常酷,在某些情况下,它减少了条件逻辑带来的混乱。但这通常是行不通的。典型的代码味道是,它不是使用方法链接来处理某个方法返回的可选,而是从可为空的内容创建可选,以链接方法并避免条件。下面是一个实际的例子(同样来自我们的演示,幻灯片42):

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

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

使用可选的方法更长,大多数人发现它比传统代码更模糊。不仅如此,它还会毫无理由地制造额外的垃圾。

底线:仅仅因为你能做某事并不意味着你应该去做。

 类似资料:
  • 问题内容: 这是Java 8中Optional类型的有效(预期)用法吗? 问题答案: 我会再摇摆一下。 这是有效用法吗?是的,从狭义上讲,它可以编译并产生您期望的结果。 这是预期用途吗?否。现在,有时候发现事情超出了最初的用途,如果行得通,那就太好了。但是对于,我们发现通常情况下效果并不理想。 在我们的JavaOne 2015演讲“ Java 8 Lambda和Streams的API设计”中 ,我

  • 考虑一个和方法。我想将s映射到s并获得第一个。显而易见的解决方案是使用,但要求返回一个流,而没有方法(或者它是或提供一个方法将其转换为,或将其作为)查看。 我能想出的最好的办法是: 但这似乎是一个很普通的案例,但却显得太冗长了。谁有更好的主意?

  • 在Java8中,可以返回而不是。Java8文档说,可选的是“一个容器对象,它可以包含非空值,也可以不包含非空值。如果存在一个值,isPresent()将返回true,而get()将返回该值。” 在实践中,这为什么有用呢?另外,有没有使用作为首选项的情况?那表演呢?

  • Swift 的可选(Optional)类型,用于处理值缺失的情况。可选表示"那儿有一个值,并且它等于 x "或者"那儿没有值"。 Swfit语言定义后缀?作为命名类型Optional的简写,换句话说,以下两种声明是相等的: var optionalInteger: Int? var optionalInteger: Optional<Int> 在这两种情况下,变量 optionalIntege

  • 我正在使用RxVertx,它是一种RxJava和Java8,我有一个编译错误。 这是我的代码: 编译错误是:“在封闭范围内定义的局部变量游戏必须是最终的或有效的最终的” 我无法将“game”定义为final,因为我在函数末尾执行分配\set并返回它。 如何编译此代码? 谢了。