首先,我要指出很多小细节,因为您似乎对这门语言很陌生,我希望这些对您的学习路径有所帮助。
首先,不惜一切代价避免var,尤其是在学习时。
虽然可变性有它的位置并且并不总是错误的,但在学习的同时强迫你避免它会对你有所帮助。特别是,当它没有提供任何价值时,请避免它;就像在这种情况下。
其次,这个List(javaList) 并没有做你认为它做的事情。它创建单个元素 Scala List,其唯一元素是 Java List。您可能想要的是将 Java List 转换为 Scala,为此您可以使用 CollectionConverters。
import scala.jdk.CollectionConverters._ // This works if you are in 2.13
// if you are in 2.12 or lower use: import scala.collection.JavaConverters._
val scalaList = javaList.asScala.toList
第三,不知道为什么要使用 Scala Stream,Stream 用于无限或非常大的集合,您希望所有转换都懒惰地进行并且只生成元素当它们被消耗时(另外,顺便说一句,它在2.13 中被弃用,取而代之的是LazyList)。
也许,您会感到困惑,因为在 Java 中您需要一个 "Stream" 来应用像 map 这样的函数式操作?如果是这样,请注意在 Scala 中所有集合都提供相同的丰富 API。
第四,Ordering 是 Typeclass,它是 Polymorphism 的功能模式。就其本身而言,这是一个非常广泛的问题,所以我不会在这里回答,但我希望这两个链接能提供见解。
TL;DR;很简单,只是T 类型的Ordering 知道如何对T 类型的(sort) 元素进行排序。因此,像max 这样的操作将适用于任何类型的任何集合,当且仅当编译器可以证明该类型的Ordering 存在时,它才会将此类值implicitly 传递给方法调用为你;再次,隐含主题非常广泛,值得拥有自己的question。
现在对于您的特定问题,您可以在List 或Stream 中致电max 或maxOption,仅此而已。
请注意,如果List 为空,则max 将抛出,而maxOption 返回一个Option,对于空输入,该Option 将为空(None);惯用的 Scala 倾向于后者而不是前者。
如果你真的想使用compareTo,那么你可以提供你自己的Ordering。
scalaList.maxOption(Ordering.fromLessThan[LocalDate]((d1, d2) => d1.compareTo(d2) < 0))