【问题标题】:How to use val instead of var in scala如何在scala中使用val而不是var
【发布时间】:2020-06-01 00:46:30
【问题描述】:

我只是想在下面的代码中删除 var 并改用 Val

def getConfigId: Long = {
val object1: java.util.List[objectA] = objectRepo.findByUser(User(session.id))

var object2: objectA = null
if (object1.size() == 1) {
  object2 = object1.get(0)
} else if (object1.size() > 1) {
  object2 = object1.get(0)
  object1.forEach(a => if (a.endDate.compareTo(object2.endDate) >= 0) {
    object2 = a
  })
}
object2.configId
}

我正在尝试使用大小写匹配,但它不起作用

def getConfigId: Long = {
val object1: java.util.List[objectA] = objectRepo.findByUser(User(session.id))

val object2: objectA = {
  case x if object1.size() == 1 => object1.get(0)

  case x => if (object1.size() > 1) {
    object1.get(0)
    object1.forEach(a => if(a.endDate.compareTo(object2.endDate) >= 0) {
     object2 = a
   })
}

【问题讨论】:

  • val object2: objectA = object1.findLast(_.endDate.compareTo(object1.get(0).endDate >= 0))
  • @jwvh 感谢您的回复,但我从 esse 得到了解决方案

标签: java scala if-statement collections functional-programming


【解决方案1】:

if 是 Scala 中的表达式 - 它返回结果值。这意味着,您可以保留您的逻辑,只需将 if 语句的返回值分配给变量:

var object2: objectA = if (object1.size() == 1) {
    object1.get(0)
  } else if (object1.size() > 1) {
    object1
      .filter(a => (a.endDate.compareTo(object1.get(0).endDate) >= 0))
      .lastOption
      .orElse(Some(object1.get(0)))
      .get
  }

甚至更简单:

val object2 = object1
      .filter(a => (a.endDate.compareTo(object1.get(0).endDate) >= 0))
      .last

【讨论】:

  • @jwvh 你说得对,我没注意到,谢谢!
  • 顺便说一句,你的两个解决方案都是错误的:),例如对于日期:[1, 2, 3, 4, 1],您将获得最新的 1,而不是 4。
  • @esse 这与问题中的相同,如前所述,它不是最新的
  • @Andronicus 感谢您的回复,但我从 esse 得到了解决方案
  • @Rohan 它会产生完全不同的值,但没关系
【解决方案2】:

这里是:

import scala.jdk.javaapi.CollectionConverters

def getConfigId: Long = {
  val values = objectRepo.findByUser(User(session.id))
  val index = values.asScala.map(_.endDate).zipWithIndex.max._2
  values.get(index).configId
}

或者:

import scala.jdk.javaapi.CollectionConverters

def getConfigId: Long = 
  objectRepo.findByUser(User(session.id)).asScala.reverse.maxBy(_.endDate).configId

【讨论】:

  • 它不应该是最新的,而是列表中的最后一个,因为它不早于第一个元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 2012-07-08
  • 1970-01-01
  • 2017-10-25
  • 2015-09-12
  • 2018-06-04
相关资源
最近更新 更多