【问题标题】:How to find max date from stream in scala using CompareTo?如何使用 CompareTo 从 scala 中的流中查找最大日期?
【发布时间】:2021-04-03 03:18:39
【问题描述】:

我是 Scala 的新手,正在尝试探索如何在 Scala 中使用 Java 功能。

我有 LocalDate 流,这是一个 Java 类,我正在尝试从我的列表中找到最大日期。

var processedResult : Stream[LocalDate] =List(javaList)
      .toStream
      .map { s => {
        //some processing
        LocalDate.parse(str, formatter)
        }
      }

我知道我们可以通过在 Java 中使用 .compare().compareTo() 轻松完成,但我不知道如何在这里使用相同的东西。

另外,我不知道 Ordering 在 Scala 中如何进行排序。

谁能建议如何完成这项工作?

【问题讨论】:

    标签: scala date functional-programming max


    【解决方案1】:

    首先,我要指出很多小细节,因为您似乎对这门语言很陌生,我希望这些对您的学习路径有所帮助。

    首先,不惜一切代价避免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 StreamStream 用于无限或非常大的集合,您希望所有转换都懒惰地进行并且只生成元素当它们被消耗时(另外,顺便说一句,它在2.13 中被弃用,取而代之的是LazyList
    也许,您会感到困惑,因为在 Java 中您需要一个 "Stream" 来应用像 map 这样的函数式操作?如果是这样,请注意在 Scala 中所有集合都提供相同的丰富 API。

    第四,OrderingTypeclass,它是 Polymorphism 的功能模式。就其本身而言,这是一个非常广泛的问题,所以我不会在这里回答,但我希望这两个链接能提供见解。
    TL;DR;很简单,只是T 类型的Ordering 知道如何对T 类型的(sort) 元素进行排序。因此,像max 这样的操作将适用于任何类型的任何集合,当且仅当编译器可以证明该类型的Ordering 存在时,它才会将此类值implicitly 传递给方法调用为你;再次,隐含主题非常广泛,值得拥有自己的question


    现在对于您的特定问题,您可以在ListStream 中致电maxmaxOption,仅此而已。
    请注意,如果List 为空,则max 将抛出,而maxOption 返回一个Option,对于空输入,该Option 将为空(None);惯用的 Scala 倾向于后者而不是前者。

    如果你真的想使用compareTo,那么你可以提供你自己的Ordering

    scalaList.maxOption(Ordering.fromLessThan[LocalDate]((d1, d2) => d1.compareTo(d2) < 0))
    

    【讨论】:

      【解决方案2】:

      Ordering[A] 是一个类型类,它定义了如何比较A 类型的两个元素。所以要比较 LocalDates 你需要 Ordering[LocalDate] 实例。

      LocalDate 在 Java 中扩展了 Comparable,Scala 方便地为 Comparables 提供了实例,因此当您调用时:

      Ordering[java.time.LocalDate]
      

      在 REPL 中,您将看到 Scala 能够为您提供实例,而无需您执行任何操作(您可以查看此类型类提供的方法列表)。

      既然你有和Ordering 在隐式范围内,哪些类型匹配Stream 的类型(例如Stream[LocalDate] 需要Ordering[LocalDate])你可以调用.max 方法......就是这样。

      val processedResult : Stream[LocalDate] = ...
      val newestDate: LocalDate = processedResult.max
      

      【讨论】:

        猜你喜欢
        • 2018-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-01
        • 1970-01-01
        • 2015-10-25
        • 1970-01-01
        相关资源
        最近更新 更多