Scala减少返回不同的数据类型

时间:2018-06-12 09:28:52

标签: scala

我从Java开始使用Scala,

此时我正在尝试解决简单算法,基本上是hh:mm到分钟之间的对话,以尝试尽可能多的scala功能。我的代码现在就是这个(它有效)

def hourToMins(time : String):String =
  time.split(':').reduce(((a:String, b: String)=> a.toInt * 60 + b.toInt + ""))  

但是,如果我在最后删除+ ""并将函数的返回类型更改为Int,则无效

def hourToMins(time : String):Int=
  time.split(':').reduce(((a:String, b: String)=> a.toInt * 60 + b.toInt ))  
found   : (String, String) => Int  
required: (Any, Any) => Any

即使我更改了它,也可以向Int添加显式转换,如

def hourToMins(time : String):Int=
  time.split(':').reduce(((a:String, b: String)=> (a.toInt * 60 + b.toInt ).toInt)

似乎这个版本也期望这两个参数是Int :(

def hourToMins(time : String):Int=
   time.split(':').reduce[Int](((a:String, b: String)=> a.toInt * 60 + b.toInt )) 

不能使它发挥作用。

这样做的正确方法是什么,我做错了什么?

2 个答案:

答案 0 :(得分:8)

您的列表项的类型与结果不同。 reduce函数不允许这样做,但foldLeft会这样做。您只需要0作为起始值。

"01:01".split(':').foldLeft(0) {
    (a, b) => a * 60 + b.toInt
}

这将返回61。

答案 1 :(得分:6)

我会一步一步地做事。

首先进行类型转换然后执行reduce。

def hourToMins(time : String): Int = 
    time.split(':')
        .map(s => s.toInt)
        .reduce(((h, m) => h * 60 + m))