我试图了解Some::flatten
的定义并遇到麻烦。以下是它的外观:
def flatten[B](implicit ev: A <:< Option[B]): Option[B] =
if (isEmpty) None else ev(this.get)
我不明白A <:< Option[B]
的意思。 <:<
是什么意思?
答案 0 :(得分:6)
这是一个广义类型约束,它确保您展平的类型的格式为Option[Option[T]]
(或List[List[T]]
)。它的作用是删除Option
或List
的一层。因此Some(Some(3))
变为Some(3)
,Some(None)
变为无,None
变为None
。对于列表:List(List(1,2), List(3))
变为List(1, 2, 3)
。
有一篇非常好的文章描述了在标准库中使用广义类型约束,找到了here。
编辑:正如@mavarazy所说,它也可以将Seq [Option [T]]压平为Seq [T]。广义类型约束是一个非常强大的设备,我认为它是Scala类型系统的高级功能之一。
答案 1 :(得分:5)
A
通常表示B
是A <:< B
的子类型。
A
反过来提供了这种子类型关系的证据,这实际上意味着有办法将B
变成flatten
。
函数Option[+A]
是implicit ev: A <:< Option[B]
类的成员,它需要
A
也就是说,有些证据表明您的类型Option[B]
可以转换为Option[A]
。从给定此证据的Option[Option[B]]
开始,它可以变成Option[B]
,然后可以将其粉碎成单个Double dVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))
.map(BigDecimal::doubleValue).orElse(null));
,其他答案可以解释它。
答案 2 :(得分:2)
如果你放轻松就会展平 - 展开(简化)输入
在Option的情况下,这意味着如果你有可空的可空,简化为单级可空
Some(Some("a")).flatten = Some("a")
如果是Seq of Options,则意味着删除所有nullables
Seq(Some("a"), None, Some("b")).flatten = Seq("a", "b")
如果Seq为Seq,则表示删除Seq级别
Seq(Seq("a"), Seq(), Seq("b", "c")).flatten = Seq("a", "b", "c")