在Scala中使用foreach查找最大值

Tim*_*kov 1 foreach scala

我有一些收集,实现def foreach(f: MyType => Unit): Unit.

MyTypeval value: Int在正常情况下具有大于或等于零的成员.

如何找到最大限度value使用的元素foreach

UPD:

应该有方法def max: MyTypeMyType实现该逻辑.

sen*_*nia 5

穿越

你可以实现scala.collection.Traversable- 然后你可以使用方法maxBy(和所有其他方法Traversable):

import scala.collection.Traversable

case class MyType(value: Int)
class MyCollection {
  def foreach(f: MyType => Unit): Unit = Seq(MyType(3), MyType(5), MyType(2)) foreach f
}

implicit class MyCollectionTraversable(c: MyCollection) extends Traversable[MyType] {
  override def foreach[U](f: MyType => U): Unit = c.foreach{e => f(e); ()}
}
Run Code Online (Sandbox Code Playgroud)

用法:

new MyCollection().maxBy{_.value}
// MyType = MyType(5)
Run Code Online (Sandbox Code Playgroud)

你也可以Ordering[MyType]像这样添加隐含:

import scala.math.Ordering
implicit val myTypeOrd = Ordering.by{ (_: MyType).value }

new MyCollection().max
// MyType = MyType(5)
Run Code Online (Sandbox Code Playgroud)

自定义方法

您也可以max手动添加自定义方法,但即使在这种情况下MyCollectionTraversable也很有用:

class MyCollectionTraversable(c: MyCollection) extends Traversable[MyType] {
  override def foreach[U](f: MyType => U): Unit = c.foreach{e => f(e); ()}
}

implicit class MyCollectionHelper(val c: MyCollection) extends AnyVal {
  def max: MyType = new MyCollectionTraversable(c).maxBy{_.value}
}
Run Code Online (Sandbox Code Playgroud)

用法:

new MyCollection().max
// MyType = MyType(5)
Run Code Online (Sandbox Code Playgroud)