flatten是什么意思?

时间:2016-07-07 10:47:03

标签: scala flatten

我试图了解Some::flatten的定义并遇到麻烦。以下是它的外观:

def flatten[B](implicit ev: A <:< Option[B]): Option[B] =
  if (isEmpty) None else ev(this.get)

我不明白A <:< Option[B]的意思。 <:<是什么意思?

3 个答案:

答案 0 :(得分:6)

这是一个广义类型约束,它确保您展平的类型的格式为Option[Option[T]](或List[List[T]])。它的作用是删除OptionList的一层。因此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通常表示BA <:< 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")