- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个返回 Optional<Foo>
的方法,如果它存在,我想使用该值来查找 Stream<Bar>
.
现在我知道我可以做到:
optionalFoo.map(foo->bars(foo)).orElse(Stream.empty());
(我使用映射函数的完整形式而不是方法引用来进行说明。)
使用 Java 9+ 我可以做到这一点:
optionalFoo.stream().flatMap(foo->bars(foo));
但不管怎样,额外的步骤似乎毫无意义。是否有一种映射方法可以简单地将可选映射到流,或者如果可选不存在则映射到空流?然后我可以这样做:
optionalFoo.streamMap(foo->bars(foo));
如果没有这样的方法,为什么不呢?它可以作为简单的默认方法添加到 Optional
上.
最后,如果我必须编写自己的实用方法,以上哪种方法更有效(看到它们都提供相同的结果):映射到流或空流;或转换为流然后平面映射到流?我会假设前者更有效,这说明了为什么需要实用方法。 (我们不想到处重新输入 .orElse(Stream.empty())
。)
对于那些需要具体用例的人,假设有一种方法可以返回 HTML <head>
来自 DOM 树的元素:
/**
* Finds the {@code <html><head>} element in the HTML namespace.
* @param document The document tree.
* @return A reference to the {@code <html><head>} element if it exists in the tree.
*/
public static Optional<Element> findHtmlHeadElement(@Nonnull final Document document);
现在另一个方法想要返回所有的 HTML <meta>
元素(如果存在)。所以它想搜索 <head>
的 child 元素,当然前提是它存在。 (请注意,childElementsByNameNS()
是一种实用方法,可将另一个元素的子元素检索为 Stream<Element>
。)
/**
* Finds the {@code <html><head><meta>} elements in an HTML document.
* @param document The document tree.
* @return A stream of {@code <html><head><meta>} elements if they exist in the tree.
*/
public static Stream<Element> htmlHeadMetaElements(@Nonnull final Document document) {
return findHtmlHeadElement(document).map(headElement ->
childElementsByNameNS(headElement, XHTML_NAMESPACE_URI_STRING, ELEMENT_META))
.orElse(Stream.empty());
}
为什么我需要额外丑陋的.orElse(Stream.empty())
样板?我宁愿有这样的东西:
/**
* Finds the {@code <html><head><meta>} elements in an HTML document.
* @param document The document tree.
* @return A stream of {@code <html><head><meta>} elements if they exist in the tree.
*/
public static Stream<Element> htmlHeadMetaElements(@Nonnull final Document document) {
return findHtmlHeadElement(document).streamMap(headElement ->
childElementsByNameNS(headElement, XHTML_NAMESPACE_URI_STRING, ELEMENT_META));
}
您可能会说“您不能使用从 Optional
到所有其他类型的特殊映射方法”,但是 Optional
和 Stream
有着特殊的关系。事实上我有点想到Optional
几乎是Stream
具有零个或一个元素。事实上,这正是 Optional.stream()
回馈。所以这真的是对 Optional.stream()
的补充.
最佳答案
关于这个问题:“‘他们’为什么不把这个方法添加到可选的?”,首先是一个旁白。
“角色”是什么意思?
您会在字典中找到许多定义,但绝对没有一个词源上是正确的,即“面具”。你看,角色来自“personare”:你说话的东西。一个面具。
可以说,persona 这个词的“作者”认为它的意思是“面具”。但是语言是动态的东西,其真正含义可能更多地取决于单词的使用方式,而不是作者的意思。
返回可选。
optional 的作者(Brian Goetz 和 Oracle 的 Lambda 项目的其他成员)将其编写为流操作终端的解决方案,这对于空流可能没有意义。 list.stream().max(someComparator)
的返回值是多少?如果列表为空?就是这样。这就是全部 j.u.Optional
曾经是为了。
社区中的一些人并不完全那样使用它。有些人更像是将它视为 scala 的可选:作为将无效信息携带到类型系统中的“解决方案”。
这是非常不明智的。也许 null 作为一个动态概念有问题并且存在更好的解决方案(值得商榷,但超出了这个问题的范围,而不是重点),但是鉴于绝对没有研究或思考,下意识地选择 Optional 作为答案是显然不好。我们已经可以看到这一点:Java 拥有 20 年成为地球上最流行的语言之一的历史,并且正如人们所期望的那样建立了一个巨大的库生态系统。您无法替换返回 X
的 API返回 Optional<X>
以向后兼容的方式,这意味着这 20 年的库中几乎每一个最后一个库都需要像昨天的垃圾一样被删除,因为没有办法转换 API。
通常,任何更新语言的提议都要求几乎所有现有的库都编写过以发布重大更新,这都是可笑的不足。然而,如果整个社区都接受这样一种观念,即应通过 API 以返回 Optional<T>
的形式传送可选返回值,那么这正是所需要的。 .
换句话说,“他们”(主要是 Oracle,以及 JCP 的其他成员)绝对不认为 Optional 应该用于什么目的。
然而,社区确实在使用它。 Oracle 仍然认为它的意思是“面具”,一半的社区坚持认为它肯定是“面具”的意思,但社区的另一半开始使用“角色”来表示戏剧中角色的概念。
现在呢?关于如何修复 java 中的“null”,我有多种想法,但首先你应该讨论它是否是一个需要修复的问题。远远超出了这个问题的范围。
但是,希望这篇关于 java 的 null 以及 Optional 为何不能替代它的文章能够阐明为什么 Oracle 或 JCP 中的其他任何人不“只是”将一些方法堆放在 j.u.Optional
中。使其更适合将其用作从 API 返回可选值的通用机制:因为他们认为(我认为完全正确)不应该为此使用可选值。。 p>
关于java - 有没有方便的从Optional到Stream的映射方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55432947/
我经常使用 var options = options || {} 作为默认为空对象的方式。它通常用于初始化选项对象,以防它未在函数调用的参数中传递。 问题是我在几个地方(博客文章、源代码)读到opt
我是Python中Rust的新手。这是我学习Rust的第四天。 在第一个问题Type casting for Option type之后,我有一个跟语法match和所有权概念有关的后续问题。 首先,我
我正在学习 Ray Wenderlich。我遇到了闭包语法错误。我想知道 Xcode 提示是什么意思? Xcode 报告如下: /Users/.../FlickrPhotosViewControlle
使用 Python 编写命令行界面 (CLI) 时 click library , 是否可以定义例如三个选项,其中仅当第一个(可选)未设置时才需要第二个和第三个选项? 我的用例是一个登录系统,它允许我
我有一个这样的 JPA 查询。 PersonRepository.java public Optional> findByStatus(int status); 人员服务.java System.ou
我遇到了很多地方,我有类似的东西 def f(s: String): Option[Long] = ... def g(l: Long): IO[Option[Wibble]] = ... val a
我有一个results: List[Future[Option[T]]]其中包含(并行)计算。 我想获得第一个非None尽快出结果,或者返回None如果所有计算都返回 None . 目前,我正在这样做
我正在尝试加载一个简单的 Listbox组件来自 @headlessui/react . 选择.tsx type Option = { id: number name: string
如何将Future[Option[Future[Option[X]]]]转换为Future[Option[X]]? 如果它是 TraversableOnce 而不是 Option 我会使用 Futur
Haskell、Rust 等语言提供了一个 Maybe 或 Option 类型。即使在 Java 中,也有一个 Optional 现在打字。 为简单起见,我将在剩下的问题中将此类型称为“选项类型”。
当我尝试在 SQL 中存储一个 XML 而不是一个空元素时,SQL 只是更改它并仅使用一个元素标签来存储它。例如,要存储的 XML 是: ROGER 然后Sql存起来就好了
使用这个非常好的命令行解析器 Argo(仅 header C++ 库)我遇到了一个小问题。请参阅:https://github.com/phforest/Argo Argo 返回:'Error: Un
我是来自 Java 背景的 Scala 新手,目前对考虑 Option[T] 的最佳实践感到困惑. 我觉得用 Option.map只是更实用和美观,但这不是说服其他人的好理由。有时, isEmpty
这个问题在这里已经有了答案: Chaining Optionals in Java 8 (9 个回答) Optional orElse Optional in Java (6 个回答) Functio
Optional::stream如果存在,则返回一个包含该值的 Stream,否则返回一个空流。所以对于 Stream> optionals , optionals.flatMap(Optional:
我使用箭头键作为输入,在 printf 菜单中上下移动 printf 箭头(“==>”)。 我正在使用一个函数来计算箭头应该在的位置,并使用 switch case 和 printf("\n==>")
这个问题在这里已经有了答案: What does the construct x = x || y mean? (12 个答案) 关闭 9 年前。 如我的问题标题所述,我最近偶然发现了这个变量声明:
这个问题在这里已经有了答案: BackboneJS: What is options || (options = {}); in Backbone source code (1 个回答) 关闭 8
我有这个简单的语法: word = Word(alphanums + '_') with_stmt = Suppress('with') + OneOrMore(Group(word('key') +
使用 Cucumber 和 SitePrism 编写测试,我在页面上有以下 HTML... Select a Status Active Product Inactive Prod
我是一名优秀的程序员,十分优秀!