scala - Option 类中的 foldLeft/foldRight 和 fold 来自哪里?
问题描述
当我尝试使用 Option 变量时。我发现有 4 折方法。
fold[B](ifEmpty:=>B)(f:Int=>B)
fold[A1 >: Int](z : A1)(op : (A1 , A1) => A1)
foldLeft[B](z : B)(op : (B , Int) => B)
foldRight[B](z : B)(op : (Int , B) => B)
第一个方法fold[B](ifEmpty:=>B)(f:Int=>B)
来自 Option 类。
其他 3 种方法来自 TraversableOnce 特征。
所以我的问题是:
1> 为什么变量可以使用 TraversableOnce 特征中的 foldLeft/foldRight 方法,而 Option 类不扩展 TraversableOnce ?
2> 为什么我不能使用折叠方法,而是使用 TraversableOnce 特征的 foldLeft/foldRight 方法?因为当我使用fold[A1 >: Int](z : A1)(op : (A1 , A1) => A1)
. IDE 没有编译成功。
val x = Some(5)
x.fold(0)( (a) => a)
x.fold(0)( (a,b) => a + b) //compile failed
val y = List(5)
y.fold(0)( (a,b) => a + b)
解决方案
Option
隐式转换为Iterable[T]
Option$该
fold
方法是由Option
自身定义的,并且由于隐式转换为 ,它是可用的Iterable[T]
,但是由于该方法是直接在类本身上定义的,因此不会尝试隐式转换。你可以强制它:
val o: Option[Int] = Some(5)
(o: Iterable[Int]).fold(0)((a, b) => a + b)
推荐阅读
- javascript - 我可以在 JavaScript 中更改 CSS 属性的值吗?
- java - 改造 onFailure() 方法的调用次数
- javascript - 检查值是否大于赛普拉斯中的某个数字
- python - 为什么我无法将我的数据系列从 pandas 输入到calmap.yearplot?尝试创建日历热图
- java - Spring 使用 @Validated 在泛型类型服务中抛出 NoUniqueBeanDefinitionException
- python - 如何将给定的日期、时间和偏移量转换为 UTC 日期时间?
- python - 如何在代码中等待 GUI(kivy)中的用户决策/输入而不阻塞 MainThread?
- python - Cassandra 选择和插入原子操作
- javascript - 如何在 Chrome 应用程序中重定向和打开链接
- android - Android Firebase 实时数据库 - 如何在不同节点中使用不同用户检索特定数据