gpt4 book ai didi

java - Scala - 如何重构方法以使用reduceLeft而不是迭代?

转载 作者:行者123 更新时间:2023-12-02 10:41:52 24 4
gpt4 key购买 nike

我有 Java 背景,最近开始学习 Scala。我实现了一种在我看来仍然更像 Java 风格的方法。如何使用各种 Scala 功能来改进它,使其成为更像 Scala 的方法?

我有一个想法要使用reduceLeft就像

val sales: List[Sale] = salesList.sortBy(_.timestamp)

sales.reduceLeft(someFunction)

该函数可以有类似于

的签名
  def reduceSalesFunction: (Sale, Sale) => Sale= {
???
}

这是我实现该方法的方法。有改进的空间吗?

def processSales(sales: List[Sale]): Sale = {
// if just a single sale, get it
if (sales.size == 1) sales.iterator.next

else {
// get the oldest sale
val sortedSales = sales.sortWith(_.timestamp < _.timestamp)
val oldestSale: Sale = sortedSales.min
val salesMetrics: Metrics = oldestSale.metrics

// update the oldest sale's metrics
for (sale <- sortedSales) {
val metrics: Metrics = sale.metrics
if (metrics.isMetric_1) salesMetrics.setIsMetric_1(metrics.isMetric_1)
if (metrics.isMetric_2) salesMetrics.setIsMetric_2(metrics.isMetric_2)
if (metrics.isMetric_3) salesMetrics.setIsMetric_3(metrics.isMetric_3)
}

// if there are metrics with `false` values set the oldest sale's metrics to `false` as well (Metrics is an Enum)
for (metric <- Metrics.values(); if !salesMetrics.isSet(metric)) {
salesMetrics.setMetricValue(metric, false)
}
oldestSale
}
}

最佳答案

我有一些风格建议给你:

  • 不要调用方法getSomthting它不是一个getter,我认为是对于 Java 也有效。
  • 您可以将 if else 替换为模式匹配。

示例:

sales match {
// if just a single sale, get it
case x :: Nil => x
// get the oldest sale
case other => //your logic
}
  • 希望使用相同的模式进行类型推断。

选择以下一项:

  val sortedSales: List[Sale] = sales.sortWith(_.timestamp < _.timestamp)
val oldestSale: Sale = sortedSales.min
val salesMetrics: Metrics = oldestSale.metrics

或者

  val sortedSales = sales.sortWith(_.timestamp < _.timestamp)
val oldestSale = sortedSales.min
val salesMetrics = oldestSale.metrics
  • 尽可能避免在方法/字段命名中使用“_”(isMetric_1)。
  • 不要使用“;”。行分隔的 block 更具可读性。

示例:

for { 
metric <- Metrics.values()
if !salesMetrics.isSet(metric)
} salesMetrics.setMetricValue(metric, false)
  • 另一个好的做法是使用不可变结构。

附注:

这只是我的意见。这取决于您的团队!

我强烈建议您查看https://docs.scala-lang.org/style/ .

享受 Scala! :)

关于java - Scala - 如何重构方法以使用reduceLeft而不是迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52872678/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com