如何在案例类中使用Scala reduceLeft?

Bri*_*box 3 scala

我理解如何在简单的整数列表上使用reduceLeft,但尝试在case类对象失败时使用if.

假设我有:

  case class LogMsg(time:Int, cat:String, msg:String)
  val cList = List(LogMsg(1,"a", "bla"), LogMsg(2,"a", "bla"), LogMsg(4,"b", "bla"))
Run Code Online (Sandbox Code Playgroud)

我想找到LogMsgs之间最大的时间差异.我想做的事情如下:

cList.reduceLeft((a,b) => (b.time - a.time)
Run Code Online (Sandbox Code Playgroud)

这当然不起作用.
reduceLeft的第一次迭代比较前两个元素,它们都是LogMsg类型.之后,它将下一个元素(LogMsg)与第一次迭代(Int)的结果进行比较.

我只是语法错误或者我应该采取另一种方式吗?

Lui*_*hys 6

我可能会这样做:

(cList, cList.tail).zipped.map((a, b) => b.time - a.time).max
Run Code Online (Sandbox Code Playgroud)

您需要事先检查cList至少有2个元素.

reduceLeft不能用来返回最大的差异,因为它总是返回你正在减少的List的类型,即LogMsg在这种情况下,你要求的是Int.


Tom*_*icz 6

我的尝试:

cList.sliding(2).map(t => t(1).time - t(0).time).max
Run Code Online (Sandbox Code Playgroud)

另一个进入我的脑海:因为LogMsg是一个案例类,我们可以利用模式匹配:

cList.sliding(2).collect{
  case List(LogMsg(a, _, _), LogMsg(b, _, _)) => b - a}.
max
Run Code Online (Sandbox Code Playgroud)