[英]How to Find the maximum consecutive years for each ID using Scala / Spark
[英]Find maximum using foreach in Scala
我有一些實現def foreach(f: MyType => Unit): Unit
集合。
MyType
具有成員val value: Int
在正常情況下, val value: Int
大於或等於零。
我coud如何找到最大元素value
使用foreach
?
UPD:
在MyType
應該有方法def max: MyType
MyType
實現此邏輯。
您可以實現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); ()}
}
用法:
new MyCollection().maxBy{_.value}
// MyType = MyType(5)
您還可以像這樣添加隱式Ordering[MyType]
:
import scala.math.Ordering
implicit val myTypeOrd = Ordering.by{ (_: MyType).value }
new MyCollection().max
// MyType = MyType(5)
您也可以手動添加自定義方法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}
}
用法:
new MyCollection().max
// MyType = MyType(5)
首先,要解決這個問題:我認為foreach
不是解決此特定問題的正確方法。 由於它沒有返回值,因此產生結果的唯一方法是副作用/易變性,這在Scala中通常被視為要避免的事情。 您可能應該研究reduce
和fold
方法,或它們專門的min
, max
...版本。
如果您確實打算使用foreach
,則需要將閉包傳遞給foreach
以更新在其作用域之外維護的免費max
變量。
這是袖手旁觀,但應該可以:
def max: MyType = {
var max = MyType(0)
foreach {t =>
if(t.value > max) max = t.value
}
max
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.